home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 3504 / 3504.xpi / scrapers.sql < prev    next >
Text File  |  2009-04-28  |  1MB  |  39,046 lines

  1. -- 262
  2.  
  3. --  ***** BEGIN LICENSE BLOCK *****
  4. --  
  5. --  Copyright (c) 2006  Center for History and New Media
  6. --                      George Mason University, Fairfax, Virginia, USA
  7. --                      http://chnm.gmu.edu
  8. --  
  9. --  Licensed under the Educational Community License, Version 1.0 (the "License");
  10. --  you may not use this file except in compliance with the License.
  11. --  You may obtain a copy of the License at
  12. --  
  13. --  http://www.opensource.org/licenses/ecl1.php
  14. --  
  15. --  Unless required by applicable law or agreed to in writing, software
  16. --  distributed under the License is distributed on an "AS IS" BASIS,
  17. --  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. --  See the License for the specific language governing permissions and
  19. --  limitations under the License.
  20. --  
  21. --  ***** END LICENSE BLOCK *****
  22.  
  23.  
  24. -- Set the following timestamp to the most recent scraper update date
  25. REPLACE INTO version VALUES ('repository', STRFTIME('%s', '2009-04-28 09:15:00'));
  26.  
  27. REPLACE INTO translators VALUES ('96b9f483-c44d-5784-cdad-ce21b984fe01', '1.0.0b4.r1', '', '2008-08-22 20:30:00', '1', '100', '4', 'Amazon.com', 'Sean Takats and Michael Berkowitz', '^https?://(?:www\.)?amazon', 
  28. 'function detectWeb(doc, url) { 
  29.  
  30.     var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
  31.     var suffixMatch = suffixRe.exec(url);
  32.     var suffix = suffixMatch[1];
  33.     var searchRe = new RegExp(''^https?://(?:www\.)?amazon\.'' + suffix + ''/(gp/search/|exec/obidos/search-handle-url/|s/)'');
  34.     if(searchRe.test(doc.location.href)) {
  35.         return "multiple";
  36.     } else {
  37.         var namespace = doc.documentElement.namespaceURI;
  38.         var nsResolver = namespace ? function(prefix) {
  39.             if (prefix == ''x'') return namespace; else return null;
  40.         } : null;
  41.         
  42.         var xpath = ''//input[@name="ASIN"]'';
  43.         if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  44.             var elmt = doc.evaluate(''//input[@name="storeID"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  45.             if(elmt) {
  46.                 var storeID = elmt.value;
  47.                 Zotero.debug("store id: " + storeID);
  48.                 if (storeID=="books"){
  49.                     return "book";
  50.                 }
  51.                 else if (storeID=="music"){
  52.                     return "audioRecording";
  53.                 }
  54.                 else if (storeID=="dvd"|storeID=="video"){
  55.                     return "videoRecording";
  56.                 }
  57.                 else {
  58.                     return "book";
  59.                 }
  60.             }
  61.             else {
  62.                 return "book";
  63.             }
  64.         }
  65.     }
  66. }
  67. ', 
  68. 'function doWeb(doc, url) {
  69.     var namespace = doc.documentElement.namespaceURI;
  70.     var nsResolver = namespace ? function(prefix) {
  71.             if (prefix == ''x'') return namespace; else return null;
  72.         } : null;
  73.     
  74.  
  75.     var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
  76.     var suffixMatch = suffixRe.exec(url);
  77.     var suffix = suffixMatch[1];
  78.  
  79.     var searchRe = new RegExp(''^https?://(?:www\.)?amazon\.'' + suffix + ''/(gp/search/|exec/obidos/search-handle-url/|s/)'');
  80.     var m = searchRe.exec(doc.location.href);
  81.     var uris = new Array();
  82.     if (suffix == "co.jp"){
  83.         suffix = "jp";
  84.     }
  85.     if (suffix == ".com") suffix = "com";
  86.     if(m) {
  87.         var xpath = ''//div[@class="productTitle"]/a | //a[span[@class="srTitle"]]'';
  88.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  89.         var elmt = elmts.iterateNext();
  90.         var asins = new Array();
  91.         var availableItems = new Array();
  92.         var i = 0;
  93.         var asinRe = new RegExp(''/(dp|product)/([^/]+)/'');
  94.         do {
  95.             var link = elmt.href;
  96.             var searchTitle = elmt.textContent;
  97.             if  (asinRe.exec(link)) {
  98.                 var asinMatch = asinRe.exec(link);
  99.                 availableItems[i] = searchTitle;
  100.                 asins[i] = asinMatch[2];
  101.                 i++;
  102.             }
  103.         } while (elmt = elmts.iterateNext());
  104.         var items = Zotero.selectItems(availableItems);
  105.         
  106.         if(!items) {
  107.             return true;
  108.         }
  109.         
  110.         for(var i in items) {
  111.             uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?Service=AWSECommerceService&Version=2006-06-28&Operation=ItemLookup&SubscriptionId=0H174V5J5R5BE02YQN02&ItemId=" + asins[i] + "&ResponseGroup=ItemAttributes");
  112.         }
  113.         
  114.     } else {
  115.         var elmts = doc.evaluate(''//input[@name = "ASIN"]'', doc,
  116.                            nsResolver, XPathResult.ANY_TYPE, null);
  117.         var elmt;
  118.         while(elmt = elmts.iterateNext()) {
  119.             var asin = elmt.value;
  120.         }
  121.         uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?Service=AWSECommerceService&Version=2006-06-28&Operation=ItemLookup&SubscriptionId=0H174V5J5R5BE02YQN02&ItemId=" + asin + "&ResponseGroup=ItemAttributes");
  122.     }
  123.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  124.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  125.         var texts = text.split("<Items>");
  126.         texts = texts[1].split("</ItemLookupResponse>");
  127.         text = "<Items>" + texts[0];
  128.         var xml = new XML(text);
  129.         var publisher = "";
  130.     
  131.         if (!xml..Errors.length()) {
  132.             if (xml..Publisher.length()){
  133.                 publisher = Zotero.Utilities.cleanString(xml..Publisher[0].text().toString());
  134.             }
  135.             
  136.             var binding = "";
  137.             if (xml..Binding.length()){
  138.                 binding = Zotero.Utilities.cleanString(xml..Binding[0].text().toString());
  139.             }
  140.             
  141.             var productGroup = "";
  142.             if (xml..ProductGroup.length()){
  143.                 productGroup = Zotero.Utilities.cleanString(xml..ProductGroup[0].text().toString());
  144.             }
  145.                 
  146.             if (productGroup=="Book") {
  147.                 var newItem = new Zotero.Item("book");
  148.                 newItem.publisher = publisher;
  149.             }
  150.             else if (productGroup == "Music") {
  151.                 var newItem = new Zotero.Item("audioRecording");
  152.                 newItem.label = publisher;
  153.                 newItem.audioRecordingType = binding;
  154.                 for(var i=0; i<xml..Artist.length(); i++) {
  155.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Artist[i].text().toString(), "performer"));
  156.                 }
  157.             }
  158.             else if (productGroup == "DVD" | productGroup == "Video") {
  159.                 var newItem = new Zotero.Item("videoRecording");
  160.                 newItem.studio = publisher;
  161.                 newItem.videoRecordingType = binding;
  162.                 for(var i=0; i<xml..Actor.length(); i++) {
  163.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Actor[i].text().toString(), "castMember"));
  164.                 }
  165.                 for(var i=0; i<xml..Director.length(); i++) {
  166.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Director[i].text().toString(), "director"));
  167.                 }        
  168.             }
  169.             else{
  170.                 var newItem = new Zotero.Item("book");
  171.                 newItem.publisher = publisher;
  172.             }
  173.             
  174.             if(xml..RunningTime.length()){
  175.                 newItem.runningTime = Zotero.Utilities.cleanString(xml..RunningTime[0].text().toString());
  176.             }
  177.             
  178.             // Retrieve authors and other creators
  179.             for(var i=0; i<xml..Author.length(); i++) {
  180.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Author[i].text().toString(), "author"));
  181.             }
  182.             if (newItem.creators.length == 0){
  183.                 for(var i=0; i<xml..Creator.length(); i++) {
  184.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Creator[i].text().toString()));
  185.                 }
  186.             }
  187.             
  188.             if (xml..PublicationDate.length()){
  189.                 newItem.date = Zotero.Utilities.cleanString(xml..PublicationDate[0].text().toString());
  190.             } else if (xml..ReleaseDate.length()){
  191.                 newItem.date = Zotero.Utilities.cleanString(xml..ReleaseDate[0].text().toString());
  192.             }
  193.             if (xml..Edition.length()){
  194.                 newItem.edition = Zotero.Utilities.cleanString(xml..Edition[0].text().toString());
  195.             }
  196.             if (xml..ISBN.length()){
  197.                 newItem.ISBN = Zotero.Utilities.cleanString(xml..ISBN[0].text().toString());
  198.             }
  199. //            Uncomment when numPages field is added to schema
  200. //            if (xml..NumberOfPages.length()){
  201. //                newItem.numPages = Zotero.Utilities.cleanString(xml..NumberOfPages[0].text().toString());
  202. //            }
  203.             var title = Zotero.Utilities.cleanString(xml..Title[0].text().toString());
  204.             if(title.lastIndexOf("(") != -1 && title.lastIndexOf(")") == title.length-1) {
  205.                 title = title.substring(0, title.lastIndexOf("(")-1);
  206.             }
  207.             if (xml..ASIN.length()){
  208.                 var url = "http://www.amazon." + suffix + "/dp/" + Zotero.Utilities.cleanString(xml..ASIN[0].text().toString());
  209.                 newItem.attachments.push({title:"Amazon.com Link", snapshot:false, mimeType:"text/html", url:url});
  210.             }
  211.             
  212.             if (xml..OriginalReleaseDate.length()){
  213.                 newItem.extra = Zotero.Utilities.cleanString(xml..OriginalReleaseDate[0].text().toString());
  214.             }
  215.             
  216.             newItem.title = title;
  217.             newItem.complete();
  218.         }
  219.     }, function() {Zotero.done;}, null);
  220.     Zotero.wait();
  221. }');
  222.  
  223. REPLACE INTO translators VALUES ('aee2323e-ce00-4fcc-a949-06eb1becc98f', '1.0.0', '', '2008-09-02 13:40:00', '0', '100', '4', 'Epicurious', 'Sean Takats', '^https?://www\.epicurious\.com/(?:tools/searchresults|recipes/food/views)', 
  224. 'function detectWeb(doc, url){
  225.     var namespace = doc.documentElement.namespaceURI;
  226.     var nsResolver = namespace ? function(prefix) {
  227.         if (prefix == ''x'') return namespace; else return null;
  228.         } : null;
  229.         
  230.     var xpath = ''//div[@id="ingredients"]'';
  231.     var multxpath = ''//table[@class="search-results"]/tbody/tr'';
  232.  
  233.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  234.         return "document";
  235.     } else if (doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  236.         return "multiple";
  237.     }
  238.     
  239. }', 
  240. 'function cleanText(s){
  241.     s = s.replace(/\n+/g, "\n");
  242.     s = s.replace(/(\n|\r)\t+/g, "\n");  
  243.     s = s.replace(/\t+/g, " ");
  244.     s = s.replace("        ", "", "g");
  245.     return s;
  246. }
  247.  
  248. function scrape(doc){
  249.     var namespace = doc.documentElement.namespaceURI;
  250.     var nsResolver = namespace ? function(prefix) {
  251.         if (prefix == ''x'') return namespace; else return null;
  252.         } : null;
  253.  
  254.     var newItem = new Zotero.Item("document");
  255.  
  256.     var xpath = ''//title'';
  257.     var title = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  258.     title = Zotero.Utilities.trimInternal(title);
  259.     title = title.substring(0, title.indexOf(" Recipe at Epicurious.com"));
  260.     newItem.title = title;
  261.  
  262.     var elmt;
  263.  
  264.     xpath = ''//p[@class="source"]'';
  265.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  266.     if (elmt = elmts.iterateNext()){
  267.         var authordate = elmt.textContent;
  268.         var authordates = authordate.split("|");
  269.         newItem.creators.push(Zotero.Utilities.cleanAuthor(authordates[0], "contributor", true));
  270.         var datestring = authordates[1].toString();
  271.         datestring = datestring.replace("Copyright", "");
  272.         newItem.date = Zotero.Utilities.formatDate(Zotero.Utilities.strToDate(datestring));
  273.         while (elmt = elmts.iterateNext()){
  274.              Zotero.debug("looping?");
  275.              Zotero.debug(elmt.textContent);
  276.             newItem.creators.push(Zotero.Utilities.cleanAuthor(elmt.textContent, "contributor", false));
  277.         }
  278.     }
  279.         
  280.     xpath = ''//div[@id="recipe_intro"]/p'';
  281.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  282.         var abstract = elmt.textContent;
  283.         abstract = Zotero.Utilities.cleanString(abstract);
  284.         newItem.abstractNote = abstract;        
  285.     }
  286.  
  287.     xpath = ''//div[@id="ingredients"]'';
  288.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  289.         var ingredients = elmt.textContent;
  290.         ingredients = Zotero.Utilities.superCleanString(ingredients);
  291.         ingredients = cleanText(ingredients);
  292.     }
  293.     xpath = ''//div[@id="preparation"]'';
  294.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  295.         var prep = elmt.textContent;
  296.         prep = Zotero.Utilities.superCleanString(prep);
  297.         prep = cleanText(prep);
  298.         prep = prep.replace(/\n/g, "\n\n");
  299.     }
  300.     xpath = ''//div[@id="recipe_summary"]/p'';
  301.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  302.         var serving = elmt.textContent;
  303.         serving = Zotero.Utilities.superCleanString(serving);
  304.         serving = cleanText(serving);
  305.     }
  306. //    notestring = ingredients + "\n\n" + prep + "\n\n" + serving;
  307. //    newItem.notes.push({note:notestring});
  308.     newItem.notes.push({note:ingredients});
  309.     newItem.notes.push({note:prep});
  310.     newItem.notes.push({note:serving});
  311.  
  312.     var url = doc.location.href;
  313.     
  314.     var snapshotURL = url.replace("/views/", "/printerfriendly/");
  315.     newItem.attachments.push({title:"Epicurious.com Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true});
  316.     newItem.url = url;
  317.     newItem.attachments.push({title:"Epicurious.com Link", snapshot:false, mimeType:"text/html", url:url});
  318.  
  319.     newItem.complete();
  320. }
  321.  
  322. function doWeb(doc, url){
  323.     var namespace = doc.documentElement.namespaceURI;
  324.     var nsResolver = namespace ? function(prefix) {
  325.         if (prefix == ''x'') return namespace; else return null;
  326.         } : null;
  327.  
  328.     var singxpath = ''//div[@id="ingredients"]'';
  329.     var multxpath = ''//table[@class="search-results"]/tbody/tr'';
  330.     if(doc.evaluate(singxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  331.         // single recipe page
  332.         scrape(doc, url);
  333.     } else if (doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  334.         var items = new Object();
  335.         var elmtxpath = ''//div[@id="resultstable"]/table[@class="search-results"]/tbody/tr/td[3][@class="name"]/a[@class="hed"]'';
  336.         var elmts = doc.evaluate(elmtxpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  337.         var elmt;
  338.         while (elmt = elmts.iterateNext()) {
  339.             var title = elmt.textContent;
  340.             var link = elmt.href;
  341.             if (title && link){
  342.                 items[link] = title;
  343.             }
  344.         }
  345.         
  346.         var items = Zotero.selectItems(items);
  347.         if(!items) {
  348.             return true;
  349.         }
  350.         
  351.         var urls = new Array();
  352.         for(var i in items) {
  353.             urls.push(i);
  354.         }
  355.         
  356.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  357.         Zotero.wait();    
  358.     }
  359. }');
  360.  
  361.  
  362. REPLACE INTO translators VALUES ('0dda3f89-15de-4479-987f-cc13f1ba7999', '1.0.0b4.r1', '', '2008-12-22 19:50:00', 1, 100, 4, 'Ancestry.com US Federal Census', 'Elena Razlogova', '^https?://search.ancestry.com/(.*)usfedcen|1890orgcen|1910uscenindex',
  363. 'function detectWeb(doc, url) {
  364.     var namespace = doc.documentElement.namespaceURI;
  365.     var nsResolver = namespace ? function(prefix) {
  366.         if (prefix == ''x'') return namespace; else return null;
  367.     } : null;
  368.         
  369.     var result = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]'', doc, nsResolver,
  370.                  XPathResult.ANY_TYPE, null).iterateNext();
  371.  
  372.     var rows = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrow record"]'', 
  373.                 doc, nsResolver, XPathResult.ANY_TYPE, null);
  374.     var row;
  375.     while(row = rows.iterateNext()) {
  376.         links = doc.evaluate(''.//a'', row, nsResolver, XPathResult.ANY_TYPE, null);
  377.         var linkNo=0;
  378.         while(link=links.iterateNext()) {
  379.             linkNo=linkNo+1;
  380.         }
  381.         break;
  382.     }
  383.     
  384.     if(result && linkNo == 2) {
  385.         return "multiple";
  386.     } else {
  387.         var indivRe = /indiv=1/;
  388.         var m = indivRe.exec(doc.location.href);
  389.         var indiv = 0;
  390.         if(m) {
  391.             indiv = 1;
  392.             }
  393.  
  394.         checkURL = doc.location.href.replace("pf=", "");
  395.         if(doc.location.href == checkURL && indiv == 1) {
  396.             return "bookSection";
  397.         }
  398.     } 
  399. }', 
  400. '// this US Federal Census scraper is a hack - so far there is no proper item type in Zotero for this kind of data (added to trac as a low priority ticket)
  401. // this scraper creates proper citation for the census as a whole (should be cited as book)
  402. // but also adds name, city, and state for a particular individual to the citation to make scanning for names & places easier in the middle pane 
  403. // (that''s why the resulting item type is a book section) 
  404. // it also adds all searchable text as a snapshot and a scan of the census record as an image
  405.  
  406. function scrape(doc) {
  407.     var namespace = doc.documentElement.namespaceURI;
  408.     var nsResolver = namespace ? function(prefix) {
  409.         if (prefix == ''x'') return namespace; else return null;
  410.     } : null;
  411.     
  412.     // get initial census data; a proper census record item type should have separate fields for all of these except perhaps dbid
  413.     var info = doc.evaluate(''//div[@class="facets"][@id="connect"]/div[@class="g_box"]/p/a'', 
  414.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();    
  415.         
  416.     if(info) {    
  417.         
  418.         info = info.toString();
  419.         var data = new Array();
  420.         var parts = info.split(/[?&]/);
  421.         for each(var part in parts) {
  422.             var index = part.indexOf("=");
  423.             if(index !== -1) {
  424.                 data[part.substr(0, index)] = part.substr(index+1);
  425.             }
  426.         }
  427.         
  428.         if(data.ln) {
  429.             var lastName = data.ln.replace(/\+/g, " ");
  430.             var firstName = data.fn.replace(/\+/g, " ");
  431.         } else { 
  432.             var lastName = data.fn.replace(/\+/g, " ");
  433.             var firstName = ""; 
  434.         }
  435.         var dOb = data.by; // this does not get saved yet because no field is available; the info is in the snapshot
  436.         if(data.rfd) {
  437.             var yearRe = /([0-9]{4})/;
  438.             var m = yearRe.exec(data.rfd);
  439.             if(m) { 
  440.                 var year = m[1];
  441.             }
  442.         } else { var year = data.ry; }
  443.         var state = data.rs.replace(/\+/g, " "); 
  444.         var county = data.rcnty.replace(/\+/g, " "); // this does not get saved yet because no field is available; the info is in the snapshot
  445.         var city = data.rcty.replace(/\+/g, " "); 
  446.         var dbid = data.dbid;
  447.     }
  448.     
  449.     // set census number for citation - let me know if this can be done in a better way
  450.     var censusYear = 0;
  451.     var censusNo = "";
  452.     var censusNos = new Array("1790", "First", "1800", "Second", "1810", "Third", "1820", "Fourth", "1830", "Fifth", "1840", "Sixth", "1850", "Seventh", "1860", "Eighth", "1870", "Ninth", 
  453.             "1880", "Tenth", "1890", "Eleventh", "1900", "Twelfth", "1910", "Thirteenth", "1920", "Fourteenth", "1930", "Fifteenth")
  454.     for(var i in censusNos) {
  455.             if(censusYear == 1) { censusNo = censusNos[i] };
  456.             if(censusNos[i] == year) { censusYear = 1 } else {censusYear= 0 };
  457.         }
  458.  
  459.     //begin adding item
  460.     var newItem = new Zotero.Item("bookSection");
  461.     newItem.title = city+", "+state; // this is not proper citation but is needed to easily scan for placenames in middle pane
  462.     newItem.publicationTitle = censusNo+" Census of the United States, "+year;
  463.     newItem.publisher = "National Archives and Records Administration";
  464.     newItem.place = "Washington, DC";
  465.     newItem.date = year;
  466.     
  467.     // get snapshot with all searchable text and a simplified link to the record for the URL field
  468.     var dbRe = /db=([0-9a-z]+)/;
  469.     var m = dbRe.exec(doc.location.href);
  470.     if(m) {
  471.         db = m[1];
  472.     }
  473.     var snapshotRe = /\&h=([0-9]+)/;
  474.     var m = snapshotRe.exec(doc.location.href);
  475.         if(m) {
  476.         snapshotURL = "http://search.ancestry.com/cgi-bin/sse.dll?db="+db+"&indiv=1&pf=1&h="+m[1];
  477.         newItem.attachments.push({title:"Ancestry.com Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true});
  478.         cleanURL = "http://search.ancestry.com/cgi-bin/sse.dll?indiv=1&db="+db+"&fh=0&h="+m[1];
  479.         newItem.url = cleanURL;
  480.     }
  481.             
  482.     // add particular individual being surveyed as contributor - this is not proper citation but is needed so one could easily scan for names in middle pane
  483.     var creator = new Array();
  484.     creator.firstName = firstName;
  485.     creator.lastName = lastName;
  486.     creator.creatorType = "author";
  487.     newItem.creators.push(creator);
  488.     
  489.     //add proper author for citation
  490.     var creator = new Array();
  491.     creator.lastName = "United States of America, Bureau of the Census";
  492.     creator.creatorType = "contributor";
  493.     newItem.creators.push(creator);
  494.  
  495.     // get scan of the census image
  496.     var scanInfo = doc.evaluate(''//div[@id="record-main"]/table[@class="p_recTable"]/tbody/tr/td[2][@class="recordTN"]/a'', 
  497.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  498.     
  499.     if(scanInfo) {
  500.         var scanRe = /iid=([A-Z0-9_-]+)/;        
  501.         var m = scanRe.exec(scanInfo);
  502.         if(m) {
  503.             scanURL = "http://content.ancestry.com/Browse/print_u.aspx?dbid="+dbid+"&iid="+m[1];
  504.             Zotero.debug("scan url: " + scanURL);
  505.         }
  506.     }
  507.     
  508.     if(scanURL){
  509.         Zotero.Utilities.HTTP.doGet(scanURL, function(text) { 
  510.             Zotero.debug("running doGet");
  511.             Zotero.debug(text);
  512.             var imageRe = /950  src="([^"]+)"/;
  513.             var m = imageRe.exec(text);
  514.                 if(m) {
  515.                     imageURL = m[1];
  516.                     Zotero.debug("image url: " + imageURL);
  517.                     newItem.attachments.push({title:"Ancestry.com Image", mimeType:"image/jpeg", url:imageURL, snapshot:true});
  518.                 }
  519.             
  520.             newItem.complete();
  521.             Zotero.done();    
  522.         });    
  523.     } else {
  524.         newItem.complete();
  525.         Zotero.done();
  526.     }
  527. }
  528.  
  529. function doWeb(doc, url) {
  530.     var resultsRegexp = /&h=/;
  531.     if(resultsRegexp.test(url)) {
  532.         scrape(doc);
  533.     } else {
  534.         var namespace = doc.documentElement.namespaceURI;
  535.         var nsResolver = namespace ? function(prefix) {
  536.             if (prefix == ''x'') return namespace; else return null;
  537.         } : null;
  538.         
  539.         // get census year for links to items
  540.         var yearRe = /db=([0-9]+)/;
  541.         var m = yearRe.exec(doc.location.href);
  542.         if(m) {
  543.             year = m[1];
  544.         }
  545.         
  546.         var dbRe = /db=([0-9a-z]+)/;
  547.         var m = dbRe.exec(doc.location.href);
  548.         if(m) {
  549.             db = m[1];
  550.         }
  551.  
  552.         //select items
  553.         var items = new Array();
  554.         var listElts = doc.evaluate(''//tr[@class="tblrow record keySelect"] | //tr[@class="tblrow record"] | //tr[@class="tblrowalt record"]'', 
  555.                 doc, nsResolver, XPathResult.ANY_TYPE, null);
  556.         var recid;
  557.         var link;
  558.         var name;
  559.         while (listElt = listElts.iterateNext()) {        
  560.             recInfo = doc.evaluate(''.//a'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  561.             var recidRe = /recid=([0-9]+)/;
  562.             var m = recidRe.exec(recInfo);
  563.             if(m) {
  564.                 recid = m[1];
  565.             }
  566.             link = "http://search.ancestry.com/cgi-bin/sse.dll?indiv=1&db="+db+"&fh=0&h="+recid;
  567.             name = doc.evaluate(''.//span[@class="srchHit"]'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  568.             items[link] = Zotero.Utilities.cleanString(name);
  569.         } 
  570.  
  571.         items = Zotero.selectItems(items);
  572.         if(!items) return true;
  573.  
  574.         var urls = new Array();
  575.         for(var i in items) {
  576.             urls.push(i);
  577.         }
  578.         
  579.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  580.         Zotero.wait();
  581.  
  582.     }
  583. }');
  584.  
  585.  
  586. REPLACE INTO translators VALUES ('838d8849-4ffb-9f44-3d0d-aa8a0a079afe', '1.0.0b3.r1', '', '2008-02-07 21:15:00', 1, 100, 4, 'OCLC WorldCat FirstSearch', 'Simon Kornblith', 'https?://[^/]*firstsearch\.oclc\.org[^/]*/WebZ/',
  587. 'function detectWeb(doc, url) {
  588.     var detailRe = /FirstSearch: [\w ]+ Detailed Record/;
  589.     var searchRe = /FirstSearch: [\w ]+ List of Records/;
  590.     
  591.     if(detailRe.test(doc.title)) {
  592.         return "book";
  593.     } else if(searchRe.test(doc.title)) {
  594.         return "multiple";
  595.     }
  596. }',
  597. 'function processURLs(urls) {
  598.     if(!urls.length) {    // last url
  599.         Zotero.done();
  600.         return;
  601.     }
  602.     
  603.     var newUrl = urls.shift();
  604.     
  605.     Zotero.Utilities.HTTP.doPost(newUrl,
  606.     ''exportselect=record&exporttype=plaintext'', function(text) {
  607.         var lineRegexp = new RegExp();
  608.         lineRegexp.compile("^([\\w() ]+): *(.*)$");
  609.         
  610.         var newItem = new Zotero.Item("book");
  611.         newItem.extra = "";
  612.         
  613.         var lines = text.split(''\n'');
  614.         for(var i=0;i<lines.length;i++) {
  615.             var testMatch = lineRegexp.exec(lines[i]);
  616.             if(testMatch) {
  617.                 var match = newMatch;
  618.                 var newMatch = testMatch
  619.             } else {
  620.                 var match = false;
  621.             }
  622.             
  623.             if(match) {
  624.                 // is a useful match
  625.                 if(match[1] == ''Title'') {
  626.                     var title = match[2];
  627.                     if(!lineRegexp.test(lines[i+1])) {
  628.                         i++;
  629.                         title += '' ''+lines[i];
  630.                     }
  631.                     if(title.substring(title.length-2) == " /") {
  632.                         title = title.substring(0, title.length-2);
  633.                     }
  634.                     newItem.title = Zotero.Utilities.capitalizeTitle(title);
  635.                 } else if(match[1] == "Series") {
  636.                     newItem.series = match[2];
  637.                 } else if(match[1] == "Description") {
  638.                     var pageMatch = /([0-9]+) p\.?/
  639.                     var m = pageMatch.exec(match[2]);
  640.                     if(m) {
  641.                         newItem.pages = m[1];
  642.                     }
  643.                 } else if(match[1] == ''Author(s)'' || match[1] == "Corp Author(s)") {
  644.                     var yearRegexp = /[0-9]{4}-([0-9]{4})?/;
  645.                     
  646.                     var authors = match[2].split('';'');
  647.                     if(authors) {
  648.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[0], "author", true));
  649.                         for(var j=1; j<authors.length; j+=2) {
  650.                             if(authors[j-1].substring(0, 1) != ''('' && !yearRegexp.test(authors[j])) {
  651.                                 // ignore places where there are parentheses        
  652.                                 newItem.creators.push({lastName:authors[j], creatorType:"author", fieldMode:true});
  653.                             }
  654.                         }
  655.                     } else {
  656.                         newItem.creators.push(Zotero.Utilities.cleanString(match[2]));
  657.                     }
  658.                 } else if(match[1] == ''Publication'') {
  659.                     match[2] = Zotero.Utilities.cleanString(match[2]);
  660.                     if(match[2].substring(match[2].length-1) == '','') {
  661.                         match[2] = match[2].substring(0, match[2].length-1);
  662.                     }
  663.                     
  664.                     // most, but not all, WorldCat publisher/places are
  665.                     // colon delimited
  666.                     var parts = match[2].split(/ ?: ?/);
  667.                     if(parts.length == 2) {
  668.                         newItem.place = parts[0];
  669.                         newItem.publisher = parts[1];
  670.                     } else {
  671.                         newItem.publisher = match[2];
  672.                     }
  673.                 } else if(match[1] == ''Institution'') {
  674.                     newItem.publisher = match[2];
  675.                 } else if(match[1] == ''Standard No'') {
  676.                     var ISBNRe = /ISBN:\s*([0-9X]+)/
  677.                     var m = ISBNRe.exec(match[2]);
  678.                     if(m) newItem.ISBN = m[1];
  679.                 } else if(match[1] == ''Year'') {
  680.                     newItem.date = match[2];
  681.                 } else if(match[1] == "Descriptor") {
  682.                     if(match[2][match[2].length-1] == ".") {
  683.                         match[2] = match[2].substr(0, match[2].length-1);
  684.                     }
  685.                     
  686.                     var tags = match[2].split("--");
  687.                     for(var j in tags) {
  688.                         newItem.tags.push(Zotero.Utilities.cleanString(tags[j]));
  689.                     }
  690.                 } else if(match[1] == "Accession No") {
  691.                     newItem.accessionNumber = Zotero.Utilities.superCleanString(match[2]);
  692.                 } else if(match[1] == "Degree") {
  693.                     newItem.itemType = "thesis";
  694.                     newItem.thesisType = match[2];
  695.                 } else if(match[1] == "DOI") {
  696.                     newItem.DOI = match[2];
  697.                 } else if(match[1] == "Database") {
  698.                     if(match[2].substr(0, 8) != "WorldCat") {
  699.                         newItem.itemType = "journalArticle";
  700.                     }
  701.                 } else if(match[1] != "Availability" &&
  702.                           match[1] != "Find Items About" &&
  703.                           match[1] != "Document Type") {
  704.                     newItem.extra += match[1]+": "+match[2]+"\n";
  705.                 }
  706.             } else {
  707.                 if(lines[i] != "" && lines[i] != "SUBJECT(S)") {
  708.                     newMatch[2] += " "+lines[i];
  709.                 }
  710.             }
  711.         }
  712.         
  713.         if(newItem.extra) {
  714.             newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
  715.         }
  716.         
  717.         newItem.complete();
  718.         processURLs(urls);
  719.     }, false, ''iso-8859-1'');
  720. }
  721.  
  722. function doWeb(doc, url) {
  723.     var sessionRegexp = /(?:\?|\:)sessionid=([^?:]+)(?:\?|\:|$)/;
  724.     var numberRegexp = /(?:\?|\:)recno=([^?:]+)(?:\?|\:|$)/;
  725.     var resultsetRegexp = /(?:\?|\:)resultset=([^?:]+)(?:\?|\:|$)/;
  726.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  727.         
  728.     var sMatch = sessionRegexp.exec(url);
  729.     var sessionid = sMatch[1];
  730.     
  731.     var hMatch = hostRegexp.exec(url);
  732.     var host = hMatch[1];
  733.     
  734.     var newUri, exportselect;
  735.     
  736.     var detailRe = /FirstSearch: [\w ]+ Detailed Record/;
  737.     if(detailRe.test(doc.title)) {
  738.         var publisherRegexp = /^(.*), (.*?),?$/;
  739.         
  740.         var nMatch = numberRegexp.exec(url);
  741.         if(nMatch) {
  742.             var number = nMatch[1];
  743.         } else {
  744.             number = 1;
  745.         }
  746.         
  747.         var rMatch = resultsetRegexp.exec(url);
  748.         if(rMatch) {
  749.             var resultset = rMatch[1];
  750.         } else {
  751.             // It''s in an XPCNativeWrapper, so we have to do this black magic
  752.             resultset = doc.forms.namedItem(''main'').elements.namedItem(''resultset'').value;
  753.         }
  754.         
  755.         urls = [host+''/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset='' + resultset + '':entityexportrecno='' + number + '':sessionid='' + sessionid + '':entitypagenum=35:0''];
  756.     } else {
  757.         var items = Zotero.Utilities.getItemArray(doc, doc, ''/WebZ/FSFETCH\\?fetchtype=fullrecord'', ''^(See more details for locating this item|Detailed Record)$'');
  758.         items = Zotero.selectItems(items);
  759.         
  760.         if(!items) {
  761.             return true;
  762.         }
  763.         
  764.         var urls = new Array();
  765.         
  766.         for(var i in items) {
  767.             var nMatch = numberRegexp.exec(i);
  768.             var rMatch = resultsetRegexp.exec(i);
  769.             if(rMatch && nMatch) {
  770.                 var number = nMatch[1];
  771.                 var resultset = rMatch[1];
  772.                 urls.push(host+''/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset='' + resultset + '':entityexportrecno='' + number + '':sessionid='' + sessionid + '':entitypagenum=35:0'');
  773.             }
  774.         }
  775.     }
  776.     
  777.     processURLs(urls);
  778.     Zotero.wait();
  779. }');
  780.  
  781. REPLACE INTO translators VALUES ('a2363670-7040-4cb9-8c48-6b96584e92ee', '1.0.0b4.r5', '', '2008-09-03 23:35:00', '0', '100', '4', 'Florida University Libraries (Endeca 1)', 'Sean Takats', '^http://[^/]+/[^\.]+.jsp\?[^/]*(?:Ntt=|NttWRD=)', 
  782. 'function detectWeb(doc, url){
  783.     var namespace = doc.documentElement.namespaceURI;
  784.     var nsResolver = namespace ? function(prefix) {
  785.         if (prefix == ''x'') return namespace; else return null;
  786.         } : null;
  787.         
  788.     var xpath = ''//div[starts-with(@id, "briefTitle")]'';
  789.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  790.         return "multiple";
  791.     }
  792.     if (url.indexOf("&V=D")){
  793.         return "book";
  794.     } else if (url.indexOf("&V=M")){
  795.         return "book";
  796.     } else if (url.indexOf("&V=U")){
  797.         return "book";
  798.     }
  799. }', 
  800. 'function doWeb(doc, url){
  801.     var newUris = new Array();
  802.     var namespace = doc.documentElement.namespaceURI;
  803.     var nsResolver = namespace ? function(prefix) {
  804.         if (prefix == ''x'') return namespace; else return null;
  805.         } : null;    
  806.     var xpath = ''//div[starts-with(@id, "briefTitle")]/a[starts-with(@id, "Title")]'';
  807.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  808.     var elmt;
  809.     if(elmt = elmts.iterateNext()) {
  810.         // search page
  811.         var items = new Array();
  812.         do {
  813.             items[elmt.href] = Zotero.Utilities.cleanString(elmt.textContent);
  814.         } while (elmt = elmts.iterateNext());
  815.         
  816.         items = Zotero.selectItems(items);
  817.         if(!items) {
  818.             return true;
  819.         }
  820.         for(var i in items) {
  821.             var newUri = i.replace(/&V=./, "&V=M");
  822.             newUris.push(newUri);
  823.         }
  824.     } else {
  825.         // single page
  826.         var newURL = url.replace(/&V=./, "&V=M");
  827.         newUris.push(newURL);
  828.     }
  829.     var translator = Zotero.loadTranslator("import");
  830.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  831.     var marc = translator.getTranslatorObject();
  832.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  833.         var uri = newDoc.location.href;
  834.         var xpath = ''//tr[@class="trGenContent"][td[3]]'';
  835.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  836.         var elmt;
  837.         
  838.         var record = new marc.record();
  839.         while(elmt = elmts.iterateNext()) {
  840.             var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./TD[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  841.             var value = newDoc.evaluate(''./TD[3]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  842.             
  843.             if(field == "LDR") {
  844.                 record.leader = value;
  845.             } else if(field != "FMT") {
  846.                 
  847.                 value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  848.                 
  849.                 var code = field.substring(0, 3);
  850.                 var ind = "";
  851.                 if(field.length > 3) {
  852.                     ind = field[3];
  853.                     if(field.length > 4) {
  854.                         ind += field[4];
  855.                     }
  856.                 }
  857.                 
  858.                 record.addField(code, ind, value);
  859.             }
  860.         }
  861.         
  862.         var newItem = new Zotero.Item();
  863.         record.translate(newItem);
  864.         
  865.         var domain = url.match(/https?:\/\/([^/]+)/);
  866.         newItem.repository = domain[1]+" Library Catalog";
  867.         
  868.         newItem.complete();
  869.     }, function() { Zotero.done(); }, null);
  870.     Zotero.wait();    
  871. }');
  872.  
  873.  
  874. REPLACE INTO translators VALUES ('88915634-1af6-c134-0171-56fd198235ed', '1.0.0b3.r1', '', '2008-12-02 10:10:00', '1', '100', '4', 'Library Catalog (Voyager)', 'Simon Kornblith', 'Pwebrecon\.cgi', 
  875. 'function detectWeb(doc, url) {
  876.     var export_options = doc.forms.namedItem(''frm'').elements.namedItem(''RD'').options;
  877.     for(var i in export_options) {
  878.         if(export_options[i].text == ''Latin1 MARC''
  879.         || export_options[i].text == ''Raw MARC''
  880.         || export_options[i].text == ''MARC 8''
  881.         || export_options[i].text == ''MARC-8''
  882.         || export_options[i].text == ''UTF-8''
  883.         || export_options[i].text == ''MARC (Unicode/UTF-8)''
  884.         || export_options[i].text == ''MARC UTF-8''
  885.         || export_options[i].text == ''UTF-8 MARC (Unicode)''
  886.         || export_options[i].text == ''UTF8-Unicode''
  887.         || export_options[i].text == ''MARC (non-Unicode/MARC-8)''
  888.         || export_options[i].text == ''MARC communication format'') {
  889.             // We have an exportable single record
  890.             if(doc.forms.namedItem(''frm'').elements.namedItem(''RC'')) {
  891.                 return "multiple";
  892.             } else {
  893.                 return "book";
  894.             }
  895.         }
  896.     }
  897. }', 
  898. 'function doWeb(doc, url) {
  899.     var postString = '''';
  900.     var form = doc.forms.namedItem(''frm'');
  901.     var newUri = form.action;
  902.     var multiple = false;
  903.     
  904.     if(doc.forms.namedItem(''frm'').elements.namedItem(''RC'')) {
  905.         multiple = true;
  906.         
  907.         var availableItems = new Object();    // Technically, associative arrays are objects
  908.             
  909.         var namespace = doc.documentElement.namespaceURI;
  910.         var nsResolver = namespace ? function(prefix) {
  911.             if (prefix == ''x'') return namespace; else return null;
  912.         } : null;
  913.         
  914.         // Require link to match this
  915.         var tagRegexp = new RegExp();
  916.         tagRegexp.compile(''Pwebrecon\\.cgi\\?.*v1=[0-9]+\\&.*ti='');
  917.         // Do not allow text to match this
  918.         var rejectRegexp = new RegExp();
  919.         rejectRegexp.compile(''\[ [0-9]+ \]'');
  920.         
  921.         var checkboxes = new Array();
  922.         var urls = new Array();
  923.         
  924.         var tableRows = doc.evaluate(''//form[@name="frm"]//table/tbody/tr[td/input[@type="checkbox"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  925.  
  926.         // Go through table rows
  927.         var tableRow;
  928.         var i = 0;
  929.         while(tableRow = tableRows.iterateNext()) {
  930.             i++;
  931.             // CHK is what we need to get it all as one file
  932.             var input = doc.evaluate(''./td/input[@name="CHK"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  933.             checkboxes[i] = input.value;
  934.             var links = tableRow.getElementsByTagName("a");
  935.             // Go through links
  936.             for(var j=0; j<links.length; j++) {
  937.                 if(tagRegexp.test(links[j].href)) {
  938.                     var text = links[j].textContent;
  939.                     if(text) {
  940.                         text = Zotero.Utilities.cleanString(text);
  941.                         if(!rejectRegexp.test(text)) {
  942.                             if(availableItems[i]) {
  943.                                 availableItems[i] += " "+text;
  944.                             } else {
  945.                                 availableItems[i] = text;
  946.                             }
  947.                         }
  948.                     }
  949.                 }
  950.             }
  951.             // if no title, pull from second td
  952.             if(!availableItems[i]) {
  953.                 availableItems[i] = Zotero.Utilities.cleanString(doc.evaluate(''./td[2]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  954.             }
  955.         }
  956.         
  957.         var items = Zotero.selectItems(availableItems);
  958.         if(!items) {
  959.             return true;
  960.         }
  961.         
  962.         // add arguments for items we need to grab
  963.         for(var i in items) {
  964.             postString += "CHK="+checkboxes[i]+"&";
  965.         }
  966.     }
  967.     
  968.     var raw, unicode, latin1;
  969.     
  970.     for(var i=0; i<form.elements.length; i++) {
  971.         if(form.elements[i].type && form.elements[i].type.toLowerCase() == ''hidden'') {
  972.             postString += escape(form.elements[i].name)+''=''+escape(form.elements[i].value)+''&'';
  973.         }
  974.     }
  975.     
  976.     var export_options = form.elements.namedItem(''RD'').options;
  977.     for(var i=0; i<export_options.length; i++) {
  978.         if(export_options[i].text == ''Raw MARC''
  979.         || export_options[i].text == ''MARC 8''
  980.         || export_options[i].text == ''MARC-8''
  981.         || export_options[i].text == ''MARC (non-Unicode/MARC-8)'') {
  982.             raw = i;
  983.         }  if(export_options[i].text == ''Latin1 MARC'') {
  984.             latin1 = i;
  985.         } else if(export_options[i].text == ''UTF-8''
  986.         || export_options[i].text == ''UTF-8 MARC (Unicode)''
  987.         || export_options[i].text == ''UTF8-Unicode''
  988.         || export_options[i].text == ''MARC UTF-8''
  989.         || export_options[i].text == ''MARC (Unicode/UTF-8)''
  990.         || export_options[i].text == ''MARC communication format'') {
  991.             unicode = i;
  992.         }
  993.     }
  994.     
  995.     var responseCharset = null;
  996.     
  997.     if(unicode) {
  998.         var rd = unicode;
  999.         responseCharset = ''UTF-8'';
  1000.     } else if(latin1) {
  1001.         var rd = latin1;
  1002.         responseCharset = ''ISO-8859-1'';
  1003.     } else if(raw) {
  1004.         var rd = raw;
  1005.     } else {
  1006.         return false;
  1007.     }
  1008.     
  1009.     postString += ''RD=''+rd+''&MAILADDY=&SAVE=Press+to+SAVE+or+PRINT'';
  1010.     
  1011.     // No idea why this doesn''t work as post
  1012.     Zotero.Utilities.HTTP.doGet(newUri+''?''+postString, function(text) {
  1013.         // load translator for MARC
  1014.         var marc = Zotero.loadTranslator("import");
  1015.         marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  1016.         marc.setString(text);
  1017.         
  1018.         // if this is the LOC catalog, specify that in repository field
  1019.         if(url.length > 23 && url.substr(0, 23) == "http://catalog.loc.gov/") {
  1020.             marc.setHandler("itemDone", function(obj, item) {
  1021.                 item.repository = "Library of Congress Catalog";
  1022.                 item.complete();
  1023.             });
  1024.         } else {
  1025.             var domain = url.match(/https?:\/\/([^/]+)/);
  1026.             marc.setHandler("itemDone", function(obj, item) {
  1027.                 item.repository = domain[1]+" Library Catalog";
  1028.                 item.complete();
  1029.             });
  1030.         }
  1031.         
  1032.         marc.translate();
  1033.         
  1034.         Zotero.done();
  1035.     }, null, responseCharset);
  1036.     Zotero.wait();
  1037. }');
  1038.  
  1039. REPLACE INTO translators VALUES ('a81243b5-a9fd-4921-8441-3142a518fdb7', '1.0', '', '2008-09-22 20:20:00', '0', '100', '4', 'Library Catalog (Voyager 7)', 'Sean Takats', '/vwebv/(holdingsInfo|search)', 
  1040. 'function detectWeb(doc, url){
  1041.     var bibIdRe = new RegExp("bibId=[0-9]+");
  1042.     if (bibIdRe.test(url)){
  1043.         return "book";
  1044.     }
  1045.     
  1046.     var namespace = doc.documentElement.namespaceURI;
  1047.     var nsResolver = namespace ? function(prefix) {
  1048.         if (prefix == ''x'') return namespace; else return null;
  1049.     } : null;    
  1050.     
  1051.     var titles = doc.evaluate(''//div[@class="resultListTextCell"]/div/label'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1052.     if (titles.iterateNext()){
  1053.         return "multiple";
  1054.     }
  1055. }', 
  1056. 'function doWeb(doc, url){
  1057.     var bibIdRe = new RegExp("bibId=([0-9]+)");
  1058.     var m = bibIdRe.exec(url);
  1059.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  1060.     var hMatch = hostRegexp.exec(url);
  1061.     var host = hMatch[1];
  1062.     
  1063.     var namespace = doc.documentElement.namespaceURI;
  1064.     var nsResolver = namespace ? function(prefix) {
  1065.         if (prefix == ''x'') return namespace; else return null;
  1066.     } : null;
  1067.     
  1068.     var newUris = new Array();
  1069.  
  1070.     if (m){ //single item
  1071.         newUris.push(host + "/vwebv/exportRecord.do?bibId=" + m[1] + "&format=utf-8");
  1072.     }
  1073.     else { //search results
  1074.         var items = new Object();
  1075.         var titles = doc.evaluate(''//div[@class="resultListTextCell"]/div/label'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1076.         var title;
  1077.         
  1078.         while (title = titles.iterateNext()) {
  1079.             var bibId = doc.evaluate(''@for'', title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1080.             items[bibId] = title.textContent;
  1081.         }
  1082.         items = Zotero.selectItems(items);
  1083.         for (var i in items) {
  1084.             newUris.push(host + "/vwebv/exportRecord.do?bibId=" + i + "&format=utf-8");
  1085.         }
  1086.     }
  1087.  
  1088.     Zotero.Utilities.HTTP.doGet(newUris, function(text) {
  1089.         // load translator for MARC
  1090.         var marc = Zotero.loadTranslator("import");
  1091.         marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  1092.         marc.setString(text);
  1093.         
  1094.         var domain = url.match(/https?:\/\/([^/]+)/);
  1095.         marc.setHandler("itemDone", function(obj, item) {
  1096.             item.repository = domain[1]+" Library Catalog";
  1097.             item.complete();
  1098.         });
  1099.  
  1100.         marc.translate();
  1101.         
  1102.         Zotero.done();
  1103.         })
  1104.     
  1105.     Zotero.wait();
  1106. }');
  1107.  
  1108. REPLACE INTO translators VALUES ('176948f7-9df8-4afc-ace7-4c1c7318d426', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'ESpacenet', 'Gilles Poulain', 'http://v3.espacenet.com/', 
  1109. 'function detectWeb(doc, url) {
  1110.  
  1111.     if(doc.location.href.match("results?")) {
  1112.             return "multiple";
  1113.         } else if (doc.location.href.match("textdoc")) {
  1114.             return "patent";
  1115.         }
  1116.   }', 
  1117. 'function doWeb(doc, url) {
  1118.    
  1119.     var namespace = doc.documentElement.namespaceURI;
  1120.     var nsResolver = namespace ? function(prefix) {
  1121.         if (prefix == ''x'') return namespace; else return null;
  1122.     } : null;
  1123.     
  1124.     var articles = new Array();
  1125.     
  1126.     if (detectWeb(doc, url) == "multiple") {
  1127.         var items = new Object();
  1128.             
  1129.         var titles = doc.evaluate(''//td[3]/strong/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1130.     
  1131.         var next_title;
  1132.         while (next_title = titles.iterateNext()) {
  1133.             items[next_title.href] = next_title.textContent;
  1134.         }
  1135.         items = Zotero.selectItems(items);
  1136.         for (var i in items) {
  1137.             articles.push(i);
  1138.         }
  1139.     } else {
  1140.         articles = [url];
  1141.     }
  1142.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  1143.     Zotero.wait();
  1144. }
  1145.    
  1146. function getItem(reftext,re) {
  1147.     var item = reftext.match(re);
  1148.     return item[1];
  1149. }
  1150.  
  1151. function scrape(doc,url) {
  1152.     var namespace = doc.documentElement.namespaceURI;
  1153.     var nsResolver = namespace ? function(prefix) {
  1154.         if (prefix == ''x'') return namespace; else return null;
  1155.     } : null;
  1156.     
  1157.     
  1158.     //Get title
  1159.     var xpath = "/html/body/form/table[2]/tbody/tr[1]/td[3]/h2";
  1160.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1161.         var title = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1162.         
  1163.         var title1 = title.split(" ");         
  1164.         for (var j in title1) {
  1165.             title1[j] = title1[j][0].toUpperCase() + title1[j].substr(1).toLowerCase();
  1166.         }
  1167.         title = title1.join(" ");
  1168.     }
  1169.  
  1170.     //Get Abstract
  1171.     var xpath = ''//td[@id="abCell"]'';
  1172.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1173.         var abstract = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1174.     }
  1175.     
  1176.     //Get Applicant
  1177.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[4]/td[2]";
  1178.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1179.         var applicant = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1180.     }
  1181.  
  1182.     //Get application number
  1183.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[8]/td[2]";
  1184.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1185.         var anumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1186.     }
  1187.     
  1188.     //Get patent number
  1189.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[1]/td[2]";
  1190.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1191.         var pnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1192.     }
  1193.     
  1194.     //Get CIB
  1195.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[6]/td[2]";
  1196.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1197.         var CIBnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1198.     }
  1199.     
  1200.     //Get ECLA
  1201.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[7]/td[2]";
  1202.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1203.         var tmpECLAnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);        
  1204.         tmpECLAnumber = tmpECLAnumber.substr(24);
  1205.         tmpECLAnumber = tmpECLAnumber.replace(/\)+/g, ''; '');
  1206.         var aus = tmpECLAnumber.split("; ");
  1207.         var ECLAnumber = "";
  1208.         for (var i=0; i< aus.length/2 ; i++){
  1209.             ECLAnumber = ECLAnumber + aus[i] + "; "
  1210.         }
  1211.     }
  1212.  
  1213.     //Get priority number
  1214.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[9]/td[2]";
  1215.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1216.         var prnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  1217.     }    
  1218.  
  1219.     
  1220.     //Get date
  1221.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[2]/td[2]";
  1222.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1223.         var date = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1224.     }
  1225.     
  1226.     //Get Creators
  1227.     var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[3]/td[2]";
  1228.     if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  1229.         var author = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);    
  1230.     }
  1231.  
  1232.     //Create Zotero Ref
  1233.     var newArticle = new Zotero.Item(''patent'');
  1234.         newArticle.url = doc.location.href;
  1235.         newArticle.title = title;
  1236.         newArticle.date = date;
  1237.         newArticle.abstractNote = abstract;
  1238.         newArticle.assignee = applicant;
  1239.         newArticle.patentNumber = pnumber;
  1240.         newArticle.priorityNumbers = prnumber;
  1241.         newArticle.applicationNumber = anumber;
  1242.         newArticle.extra = "CIB: " + CIBnumber + "\nECLA: " + ECLAnumber
  1243.  
  1244.     var author1 = author.split("; ");
  1245. ;
  1246.     for (var m = 0; m< author1.length; m++) {
  1247.         
  1248.         if (author1[m].match(/\(/)) {
  1249.             author1[m] = author1[m].substr(0, author1[m].length-5);
  1250.         }
  1251.         words = author1[m].split(/\s/);
  1252.  
  1253.         for (var j in words) {
  1254.             words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  1255.         }
  1256.  
  1257.         var inventor = '''';
  1258.         for (var k = 1; k < words.length; k++) {
  1259.             inventor = inventor +words[k] + " ";
  1260.             if (k == words.length-1) {
  1261.                 inventor = inventor +words[0];
  1262.                 newArticle.creators.push(Zotero.Utilities.cleanAuthor(inventor, "inventor"));
  1263.             }
  1264.         }
  1265.     }
  1266.  
  1267.      newArticle.complete();
  1268. }');
  1269.  
  1270. REPLACE INTO translators VALUES ('f6717cbb-2771-4043-bde9-dbae19129bb3', '1.0.0b4.r5', '', '2008-07-24 05:15:00', '0', '100', '4', 'Archeion', 'Adam Crymble', 'http://archeion-aao', 
  1271. 'function detectWeb(doc, url) {
  1272.     if (doc.evaluate(''//td[@class="full"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1273.         return "multiple";
  1274.     } else if (doc.evaluate(''//div[@class="main"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1275.         return "book";
  1276.     }
  1277. }', 
  1278. '//Archeion translator. code by Adam Crymble
  1279. //The way the site is formatted, I can''t split the creators up logically. I have left them off for now.
  1280.  
  1281. function associateData (newItem, dataTags, field, zoteroField) {
  1282.     if (dataTags[field]) {
  1283.         newItem[zoteroField] = dataTags[field];
  1284.     }
  1285. }
  1286.  
  1287. function scrape(doc, url) {
  1288.     var namespace = doc.documentElement.namespaceURI;
  1289.     var nsResolver = namespace ? function(prefix) {
  1290.         if (prefix == ''x'') return namespace; else return null;
  1291.     } : null;
  1292.     
  1293.     newItem = new Zotero.Item("book");
  1294.     
  1295.     var xPathHeadings = doc.evaluate(''//th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1296.     var xPathContent = doc.evaluate(''//table[@class="results"]/tbody/tr/td'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1297.     var xPathCount = doc.evaluate(''count (//th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1298.     
  1299.     var fieldTitle;
  1300.     var dataTags = new Object();
  1301.     var multiAuthorCheck = new Array();
  1302.     
  1303.     
  1304.     for (var i = 0; i < xPathCount.numberValue; i++) {
  1305.         fieldTitle=xPathHeadings.iterateNext().textContent.replace(/\s+/g, '''');
  1306.     
  1307.         //This was Michael Berkowitz''s suggested Fix.
  1308.  
  1309.             /*var ts = doc.getElementsByTagName(("table"), 1) = ts.length, ar = [];
  1310.             while ((i--)) {
  1311.                 if (ts[i].className&&ts[i].className.match("results")) {
  1312.                     ar[ar.length] = ts[i].getElementsByTagName("td")[0].split(/\<br\>/);
  1313.                 }
  1314.             }
  1315.             Zotero.debug(ar[0][0]); */
  1316.         
  1317.     //COULDN"T SPLIT BY ("\n") TO SEPARATE MULTIPLE CREATORS.
  1318.         if (fieldTitle == "Creator:" | fieldTitle == "Cr├⌐ateur:") {
  1319.             fieldTitle == "Creator:";
  1320.             
  1321.             var authorContent = xPathContent.iterateNext().textContent;
  1322.             //Zotero.debug(authorContent);
  1323.             
  1324.             //if (authorContent.match('' (*) '')) {
  1325.             //    Zotero.debug(doc.title);
  1326.             //}
  1327.             
  1328.             
  1329.             
  1330.             //var test = authorContent.split(/\<br\>/);
  1331.             //Zotero.debug(test);
  1332.             
  1333.             authors = authorContent.match(/\w+,?\s+[\w\(\)\.]+/g);
  1334.             
  1335.             //Zotero.debug(authors);
  1336.             
  1337.             
  1338.             for (i = 0; i < authors.length; i++) {
  1339.                 
  1340.                 var author = authors[i].split(", "); 
  1341.                 
  1342.                 if (author.length < 2) {
  1343.                     
  1344.                     dataTags["Creator:"] = author[0];
  1345.                     newItem.creators.push({lastName: dataTags["Creator:"], creatorType: "creator"});
  1346.                 
  1347.                 } else {
  1348.                     
  1349.                     dataTags["Creator:"] = (author[1] + (" ") + author[0]);
  1350.                     //Zotero.debug(authorArranged);
  1351.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Creator:"], "creator"));
  1352.                 }
  1353.             }
  1354.             
  1355.         } else {
  1356.  
  1357.  
  1358.     
  1359.         dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent);
  1360.         //Zotero.debug(fieldTitle);
  1361.         }
  1362.     }
  1363.     
  1364.     associateData (newItem, dataTags, "Datesofmaterial:", "date");    
  1365.     associateData (newItem, dataTags, "Repository:", "repository");    
  1366.     associateData (newItem, dataTags, "ReferenceNumber:", "callNumber");    
  1367.     associateData (newItem, dataTags, "PhysicalDescription:", "extra");    
  1368.     associateData (newItem, dataTags, "Scopeandcontent", "abstractNote");
  1369.     
  1370.     associateData (newItem, dataTags, "Dates:", "date");    
  1371.     associateData (newItem, dataTags, "Centred''archives:", "repository");    
  1372.     associateData (newItem, dataTags, "Num├⌐roder├⌐f├⌐rence:", "callNumber");    
  1373.     associateData (newItem, dataTags, "Descriptionmat├⌐rielle:", "extra");    
  1374.     associateData (newItem, dataTags, "Port├⌐eetcontenu", "abstractNote");
  1375.     
  1376.     newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1377.     
  1378.     newItem.url = doc.location.href;
  1379.     newItem.complete();
  1380. }
  1381.  
  1382. function doWeb(doc, url) {
  1383.     var namespace = doc.documentElement.namespaceURI;
  1384.     var nsResolver = namespace ? function(prefix) {
  1385.         if (prefix == ''x'') return namespace; else return null;
  1386.     } : null;
  1387.     
  1388.     var articles = new Array();
  1389.     
  1390.     if (detectWeb(doc, url) == "multiple") {
  1391.         var items = new Object();
  1392.         var xPathLinks = doc.evaluate(''//td[@class="full"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1393.         var linksCounter = doc.evaluate(''count (//td[@class="full"]/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1394.         var xPathTitles = doc.evaluate(''//table[@class="results"]/tbody/tr[1]/td'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1395.         
  1396.         var next_link;
  1397.         for (var i = 0; i < linksCounter.numberValue; i++) {
  1398.             next_link = xPathLinks.iterateNext().href;
  1399.             items[next_link] = xPathTitles.iterateNext().textContent;
  1400.             
  1401.         }
  1402.             
  1403.         items = Zotero.selectItems(items);
  1404.         for (var i in items) {
  1405.             articles.push(i);
  1406.         }
  1407.     } else {
  1408.         articles = [url];
  1409.     }
  1410.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  1411.     Zotero.wait();
  1412.  
  1413. }
  1414. ');
  1415.  
  1416.  
  1417. REPLACE INTO translators VALUES ('d9a16cf3-8b86-4cab-8610-dbd913ad1a44', '1.0.0b4.r5', '', '2008-07-24 05:30:00', '0', '100', '4', 'Archives Canada-France', 'Adam Crymble', 'http://bd.archivescanadafrance.org', 
  1418. 'function detectWeb(doc, url) {
  1419.     
  1420.     if (doc.location.href.match("doc.xsp?")) {
  1421.         return "book";
  1422.     } else if (doc.evaluate(''//li/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1423.         return "multiple";
  1424.     } else if (doc.evaluate(''//td[1][@class="icones"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1425.         return "multiple";
  1426.     }
  1427. }', 
  1428. 'function associateData (newItem, dataTags, field, zoteroField) {
  1429.     if (dataTags[field]) {
  1430.         newItem[zoteroField] = dataTags[field];
  1431.     }
  1432. }
  1433.  
  1434. function scrape(doc, url) {
  1435.  
  1436.     var namespace = doc.documentElement.namespaceURI;
  1437.     var nsResolver = namespace ? function(prefix) {
  1438.         if (prefix == ''x'') return namespace; else return null;
  1439.     } : null;    
  1440.     
  1441.     var dataTags = new Object();
  1442.     var tagsContent = new Array();
  1443.     var fieldTitle;
  1444.         
  1445.     var newItem = new Zotero.Item("book");
  1446.     var xPathHeaders = ''//td[2]/div[@class="ead-c"]/div[@class="ead-did"]/table[@class="ead-did"]/tbody/tr/td[1]'';
  1447.  
  1448.     if (doc.evaluate(xPathHeaders, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1449.         var headers = doc.evaluate(xPathHeaders, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1450.         var contents = doc.evaluate(''//td[2][@class="did-content"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1451.     
  1452.         while (fieldTitle = headers.iterateNext()) {
  1453.             fieldTitle = fieldTitle.textContent.replace(/\s+/g, '''');
  1454.             if (fieldTitle == "Origination" || fieldTitle == "Origine") {
  1455.                 fieldTitle = "Origination";
  1456.             }
  1457.             dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  1458.         }
  1459.         
  1460.         if (dataTags["Origination"]) {
  1461.             var author = dataTags["Origination"];
  1462.             if (!author.match(", ")) {
  1463.                 newItem.creators.push({lastName: author, creatorType: "author"});
  1464.             } else {
  1465.                 var authors = author.split(", ");
  1466.                 author = authors[1] + " " + authors[0];
  1467.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  1468.             }
  1469.         }
  1470.     }
  1471.     
  1472.     
  1473.     if (doc.evaluate(''//h1[@class="doc-title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1474.         newItem.title = doc.evaluate(''//h1[@class="doc-title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1475.     } else if (doc.evaluate(''//td[2]/div[@class="notice"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1476.         newItem.title = doc.evaluate(''//td[2]/div[@class="notice"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1477.     } else {        
  1478.         newItem.title = doc.title + " Title Not Found";
  1479.     }
  1480.         
  1481.     associateData (newItem, dataTags, "PhysicalDescription", "pages");
  1482.     associateData (newItem, dataTags, "Descriptionmat├⌐rielle", "pages");
  1483.     
  1484.     associateData (newItem, dataTags, "Repository", "repository");
  1485.     associateData (newItem, dataTags, "Lieudeconservation", "repository");
  1486.     
  1487.     associateData (newItem, dataTags, "LanguageoftheMaterial", "language");
  1488.     associateData (newItem, dataTags, "Langue", "language");
  1489.     
  1490.     associateData (newItem, dataTags, "Identifier", "callNumber");
  1491.     associateData (newItem, dataTags, "Cote", "callNumber");
  1492.     
  1493.     associateData (newItem, dataTags, "Datesextr├¬mes", "date");
  1494.     associateData (newItem, dataTags, "Dates", "date");
  1495.  
  1496.     newItem.url = doc.location.href;
  1497.     newItem.complete();
  1498. }
  1499.  
  1500. function doWeb(doc, url) {
  1501.     var namespace = doc.documentElement.namespaceURI;
  1502.     var nsResolver = namespace ? function(prefix) {
  1503.         if (prefix == ''x'') return namespace; else return null;
  1504.     } : null;
  1505.     
  1506.     var articles = new Array();
  1507.     
  1508.     if (detectWeb(doc, url) == "multiple") {
  1509.         
  1510.         var items = new Object();
  1511.         
  1512.         if (doc.evaluate(''//td[1][@class="icones"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1513.             var titles = doc.evaluate(''//td[2][@class="ressource"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1514.             var titlesCount = doc.evaluate(''count (//td[2][@class="ressource"])'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1515.             var links = doc.evaluate(''//td[1][@class="icones"]/a'', doc,  nsResolver, XPathResult.ANY_TYPE, null);
  1516.                 
  1517.             var next_link;
  1518.             
  1519.             for (var i = 0; i < titlesCount.numberValue; i++) {
  1520.                 next_link = links.iterateNext().href;
  1521.                 if (!next_link.match("doc.xsp")) {
  1522.                     next_link = links.iterateNext().href;
  1523.                 }
  1524.                 items[next_link] = titles.iterateNext().textContent;
  1525.             }
  1526.         }
  1527.         
  1528.         if (doc.evaluate(''//li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1529.             var titles = doc.evaluate(''//li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1530.             var next_title;
  1531.             while (next_title = titles.iterateNext()) {
  1532.                 items[next_title.href] = next_title.textContent;
  1533.             }
  1534.         }
  1535.         
  1536.         items = Zotero.selectItems(items);
  1537.             for (var i in items) {
  1538.                 articles.push(i);
  1539.             }
  1540.         
  1541.     } else if (doc.evaluate(''//div[@class="ancestor"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1542.         
  1543.         var link = doc.evaluate(''//div[@class="ancestor"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  1544.     
  1545.         articles = [link];
  1546.     } else {
  1547.         articles = [url]
  1548.     }
  1549.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  1550.     Zotero.wait();
  1551. }');
  1552.  
  1553.  
  1554. REPLACE INTO translators VALUES ('661fc39a-2500-4710-8285-2d67ddc00a69', '1.0', '', '2008-09-02 13:55:00', '0', '100', '4', 'Artefacts Canada', 'Adam Crymble', 'http://daryl.chin.gc.ca', 
  1555. 'function detectWeb(doc, url) {
  1556.     var multi1 = '''';
  1557.     var single1 = '''';
  1558.     
  1559.     if (doc.evaluate(''//div[@id="mainContent"]/table/tbody/tr/td[1]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1560.         
  1561.         multi1 = doc.evaluate(''//div[@id="mainContent"]/table/tbody/tr/td[1]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1562.     }
  1563.     
  1564.     var xpath = ''//tbody/tr[1]/td[2]/span'';
  1565.     if (doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1566.         single1 = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1567.     }
  1568.     
  1569.     if (multi1.match("Search Results") || multi1.match("R├⌐sultats de recherche")) {
  1570.         return "multiple";
  1571.     } else if (single1.match("Document") || single1.match("Enregistrement")) {
  1572.         return "artwork";
  1573.     }
  1574.     
  1575. }', 
  1576. 'function associateData (newItem, dataTags, field, zoteroField) {
  1577.     if (dataTags[field]) {
  1578.         newItem[zoteroField] = dataTags[field];
  1579.     }
  1580. }
  1581.  
  1582. function scrape(doc, url) {
  1583.  
  1584.     var namespace = doc.documentElement.namespaceURI;
  1585.     var nsResolver = namespace ? function(prefix) {
  1586.         if (prefix == ''x'') return namespace; else return null;
  1587.     } : null;    
  1588.     
  1589.     var dataTags = new Object();
  1590.     var tagsContent = new Array();
  1591.     var fieldTitle;
  1592.     
  1593.     var newItem = new Zotero.Item("artwork");
  1594.  
  1595.     var headers = doc.evaluate(''//td[1][@class="leftResTitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1596.     var contents = doc.evaluate(''//td[2][@class="pageText"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1597.     
  1598.     while (fieldTitle = headers.iterateNext()) {
  1599.         fieldTitle = fieldTitle.textContent.replace(/\s+/g, '''');
  1600.         if (fieldTitle == "Titre:") {
  1601.             fieldTitle = "Title:";
  1602.         } else if (fieldTitle == "Nomdel''objet:") {
  1603.             fieldTitle = "NameofObject:";
  1604.         } else if (fieldTitle == "Sujetouimage:") {
  1605.             fieldTitle = "Subject/Image:";
  1606.         } else if (fieldTitle == "Num├⌐rod''accession:") {
  1607.             fieldTitle = "AccessionNumber:";
  1608.         } else if (fieldTitle == "Artisteouartisan:") {
  1609.             fieldTitle = "Artist/Maker:";
  1610.         } else if (fieldTitle == "Fabricant:") {
  1611.             fieldTitle = "Manufacturer:";
  1612.         }
  1613.         
  1614.         dataTags[fieldTitle] = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '''')
  1615.     }
  1616.  
  1617.     Zotero.debug(dataTags);
  1618.  
  1619.     if (dataTags["Artist/Maker:"]) {
  1620.         if (dataTags["Artist/Maker:"].match(", ")) {
  1621.             var authors = dataTags["Artist/Maker:"].split(", ");
  1622.             authors = authors[0] + '' '' + authors[1];
  1623.             newItem.creators.push(authors, "creator");    
  1624.         } else {
  1625.             newItem.creators.push(dataTags["Artist/Make:"], "creator");    
  1626.         }
  1627.     }
  1628.     
  1629.     if (dataTags["Manufacturer:"]) {
  1630.         newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Manufacturer:"], "creator"));    
  1631.     }
  1632.     
  1633.     if (dataTags["AccessionNumber:"]) {
  1634.         newItem.locInArchive = "Accession Number: " + dataTags["AccessionNumber:"];
  1635.     }
  1636.     
  1637.     if (dataTags["Subject/Image:"]) {
  1638.         if (dataTags["Subject/Image:"].match(/\n/)) {
  1639.             var subjects = dataTags["Subject/Image:"].split(/\n/);
  1640.             for (var i = 0; i < subjects.length; i++) {
  1641.                 newItem.tags[i] = subjects[i];
  1642.             }
  1643.         } else {
  1644.             newItem.tags[0] = dataTags["Subject/Image:"].match(/\n/);
  1645.         }
  1646.     }
  1647.     
  1648.     if (dataTags["Title:"]) {
  1649.         associateData (newItem, dataTags, "Title:", "title");
  1650.         associateData (newItem, dataTags, "NameofObject:", "medium");
  1651.     } else if (dataTags["NameofObject:"]) {
  1652.         associateData (newItem, dataTags, "NameofObject:", "title");
  1653.     } else {
  1654.         newItem.title = "No Title Found";
  1655.     }
  1656.     
  1657.     associateData (newItem, dataTags, "LatestProductionDate:", "date");
  1658.     associateData (newItem, dataTags, "Datedefindeproduction:", "date");
  1659.     
  1660.     associateData (newItem, dataTags, "Institution:", "repository");
  1661.     associateData (newItem, dataTags, "├ëtablissement:", "repository");
  1662.     
  1663.     associateData (newItem, dataTags, "Description:", "description");
  1664.     
  1665.     associateData (newItem, dataTags, "Medium:", "medium");
  1666.     associateData (newItem, dataTags, "M├⌐dium:", "medium");
  1667.     
  1668.     newItem.url = doc.location.href;
  1669.     newItem.complete();
  1670. }
  1671.  
  1672. function doWeb(doc, url) {
  1673.     var namespace = doc.documentElement.namespaceURI;
  1674.     var nsResolver = namespace ? function(prefix) {
  1675.         if (prefix == ''x'') return namespace; else return null;
  1676.     } : null;
  1677.     
  1678.     var articles = new Array();
  1679.     
  1680.     if (detectWeb(doc, url) == "multiple") {
  1681.         var items = new Object();
  1682.         
  1683.         var titles = doc.evaluate(''//tr[1]/td[2][@class="pageText"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1684.         var links = doc.evaluate(''//td/a[@class="moreInfoink"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1685.         
  1686.         var next_title;
  1687.         while (next_title = titles.iterateNext()) {
  1688.         
  1689.             items[links.iterateNext().href] = next_title.textContent;
  1690.         }
  1691.         items = Zotero.selectItems(items);
  1692.         for (var i in items) {
  1693.             articles.push(i);
  1694.         }
  1695.     } else {
  1696.         articles = [url];
  1697.     }
  1698.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  1699.     Zotero.wait();
  1700. }
  1701. ');
  1702.  
  1703. REPLACE INTO translators VALUES ('fef07360-ee97-4f67-b022-6f64d5ec0c25', '1.0.0b4.r5', '', '2008-09-22 20:20:00', '1', '100', '4', 'KOBV', 'Gunar Maiwald', '^http://vs13.kobv.de/V/', 
  1704. 'function detectWeb(doc, url) {
  1705.     if (doc.evaluate(''//tr /td[@class="no_wrap_center"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1706.         return "multiple";
  1707.     }
  1708.     else if (doc.evaluate(''//tr/th[@class="no_wrap"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1709.         return "book";
  1710.     }
  1711. }', 
  1712. 'function scrape(doc) {
  1713.     var translator = Zotero.loadTranslator("import");
  1714.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  1715.     var marc = translator.getTranslatorObject();
  1716.  
  1717.      var xpath;
  1718.     if (doc.title.match("Freie Universit├ñt Berlin")) { xpath =''//li/a[@title="Ansicht des Originalformats"]''; }
  1719.     else if (doc.title.match("KOBV")) { xpath =''//li/a[@title="Ansicht des bibliothekarischen Formats"]''; }
  1720.     else if (doc.title.match("UB der HU Berlin")) { xpath =''//li/a[@title="Ansicht des Originalformats"]''; }
  1721.     else if (doc.title.match("^MetaLib")) { xpath =''//li/a[@title="Ansicht des Originalformats"]''; }
  1722.     var hrefs = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  1723.     var href;
  1724.     
  1725.     while (href = hrefs.iterateNext()) {
  1726.         var url = href.getAttribute("href");
  1727.         url += "&format=005";
  1728.         
  1729.         Zotero.Utilities.processDocuments([url], function(newDoc) {
  1730.             var record = new marc.record();
  1731.             var xpath = ''//table//tr'';
  1732.             var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null);
  1733.             var elmt;
  1734.             
  1735.             while (elmt = elmts.iterateNext()) {
  1736.                 var field = Zotero.Utilities.trimInternal(newDoc.evaluate(''./td[1]'', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  1737.                 var value = Zotero.Utilities.trimInternal(newDoc.evaluate(''./td[2]'', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  1738.                 value = value.replace(/\|([a-z]) /g,marc.subfieldDelimiter+"$1");
  1739.                 var code = field.substring(0,3);
  1740.                 var ind = field.substr(3);
  1741.                 
  1742.                 // QnD for Authors:
  1743.                 if (code == "100" && ind == "11" && value.match(marc.subfieldDelimiter+"b"))  {
  1744.                     var values = value.split(marc.subfieldDelimiter);
  1745.                     var forename = values[1].substr(1);
  1746.                     var surname = values[2].substr(1);
  1747.                     value = marc.subfieldDelimiter+"a"+surname+", "+forename;
  1748.                     ind = 1;
  1749.                 }
  1750.                         record.addField(code, ind, value);
  1751.             }
  1752.             
  1753.             var newItem = new Zotero.Item();
  1754.             record.translate(newItem);
  1755.             newItem.complete();                    
  1756.             
  1757.         }, function() { Zotero.done; });
  1758.         Zotero.wait();
  1759.     } 
  1760. }
  1761.  
  1762.  
  1763. function doWeb(doc, url) {
  1764.     var xpath1 = ''//table/tbody/tr/td[@class="no_wrap_center"]/a'';
  1765.     var xpath2 = ''//table/tbody/tr/th[@class="no_wrap"]'';
  1766.     var newUrls = new Array();
  1767.     
  1768.     if (doc.evaluate(xpath1, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1769.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^http://vs13.kobv.de/V/.*format=999$'',''^[0-9]+$'');
  1770.         items = Zotero.selectItems(items);
  1771.         for (var url in items) {
  1772.             newUrls.push(url);
  1773.         }
  1774.     }
  1775.     
  1776.     else if (doc.evaluate(xpath2, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1777.         newUrls.push(url);
  1778.     }
  1779.     
  1780.     Zotero.Utilities.processDocuments(newUrls, scrape, function() { Zotero.done; });
  1781.     Zotero.wait();
  1782. }');
  1783.  
  1784. REPLACE INTO translators VALUES ('39ea814e-8fdb-486c-a88d-59479f341066', '1.0.0b4.r5', '', '2008-07-24 05:15:00', '0', '100', '4', 'Bibliotheque UQAM', 'Adam Crymble', 'http://www.manitou.uqam.ca', 
  1785. 'function detectWeb(doc, url) {
  1786.     
  1787.     if (doc.evaluate(''//center/table/tbody/tr[1]/td/input'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  1788.         return "multiple";
  1789.     } else if (doc.title.match("d├⌐tails")) {
  1790.         return "book";
  1791.     }
  1792. }', 
  1793. 'function associateData (newItem, dataTags, field, zoteroField) {
  1794.     if (dataTags[field]) {
  1795.         newItem[zoteroField] = dataTags[field];
  1796.     }
  1797. }
  1798.  
  1799. function scrape(doc, url) {
  1800.     var namespace = doc.documentElement.namespaceURI;
  1801.     var nsResolver = namespace ? function(prefix) {
  1802.         if (prefix == "x" ) return namespace; else return null;
  1803.     } : null;
  1804.     
  1805.     var newItem = new Zotero.Item("book");
  1806.     
  1807.     var dataTags = new Object();
  1808.     var tagsContent = new Array();
  1809.     var contents;
  1810.     var newItemAuthors1 = new Array();
  1811.     var newItemAuthors2 = new Array();
  1812.     
  1813.     var xPathHeadings = doc.evaluate(''//p/table/tbody/tr/td[1]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1814.     var xPathContents = doc.evaluate(''//p/table/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1815.     var xPathCount = doc.evaluate(''count (//p/table/tbody/tr/td[1]/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1816.  
  1817.     var dump = xPathHeadings.iterateNext();
  1818.         
  1819.     for (i=0; i<xPathCount.numberValue-1; i++) {
  1820.                          
  1821.              fieldTitle=xPathHeadings.iterateNext().textContent.replace(/\s+/g, '''');
  1822.              contents = xPathContents.iterateNext().textContent;
  1823.     
  1824.         if (fieldTitle == "Titres:") {
  1825.             fieldTitle = "Titre:";
  1826.         }
  1827.     
  1828.     //determines media type
  1829.         if (fieldTitle == "Titre:") {
  1830.             
  1831.             dataTags[fieldTitle] = contents.replace(/^\s*|\s*$/g, '''');
  1832.             
  1833.             if (contents.match("enregistrement sonore")) {
  1834.                 var newItem = new Zotero.Item("audioRecording");    
  1835.             } else if (contents.match("musique")) {
  1836.                 var newItem = new Zotero.Item("audioRecording");
  1837.             } else if (contents.match("enregistrement vid├⌐o")) {
  1838.                 var newItem = new Zotero.Item("videoRecording");
  1839.             } else {
  1840.                 var newItem = new Zotero.Item("book");
  1841.             }
  1842.         }
  1843.     
  1844.     //gets author(s).
  1845.         if (fieldTitle == "Auteur:") {
  1846.             fieldTitle = "author";
  1847.             
  1848.             dataTags[fieldTitle] = contents;
  1849.                  if (dataTags[fieldTitle].match(",")) {
  1850.                      var authorName = dataTags["author"].split(",");
  1851.                      authorName[0] = authorName[0].replace(/^\s*|\s*$/g, '''');
  1852.                      dataTags["author"] = (authorName[1] + (" ") + authorName[0]);
  1853.                  } else {
  1854.                      var parenthesis = dataTags["author"].indexOf("(");
  1855.                      if (parenthesis > 0) {
  1856.                          dataTags["author"] = dataTags["author"].substr(0, parenthesis);
  1857.                      }
  1858.                      dataTags["author"] = dataTags["author"].replace(/^\s*|\s*$/g, '''');
  1859.                  }
  1860.     
  1861.              } else if (fieldTitle == "Auteurs:") {
  1862.                  
  1863.                  dataTags[fieldTitle] = contents;
  1864.           
  1865.                  var multiAuthors = dataTags["Auteurs:"].split(/\n/);
  1866.                  for (var j = 0; j < multiAuthors.length; j++) {
  1867.                      var parenthesis = multiAuthors[j].indexOf("(");
  1868.                  
  1869.                      if (parenthesis > 0) {
  1870.                          multiAuthors[j] = multiAuthors[j].substr(0, parenthesis);
  1871.                      }
  1872.                      
  1873.                      if (multiAuthors[j] != "" && multiAuthors[j] != '' '') {
  1874.                       if (multiAuthors[j].match(", ")) {
  1875.                           var authorName = multiAuthors[j].split(",");     
  1876.                              newItemAuthors1.push(authorName[1] + (" ") + authorName[0]);
  1877.                       } else {
  1878.                           newItemAuthors2.push(multiAuthors[j]);
  1879.                       }
  1880.                      }       
  1881.                  }
  1882.                  
  1883.         } else if (fieldTitle == "├ëditeur:") {
  1884.             dataTags[fieldTitle] = contents;
  1885.             var imprintSplit = dataTags["├ëditeur:"].split(": ");
  1886.             if (imprintSplit.length > 1) {
  1887.                 newItem.place = imprintSplit[0].replace(/^\s*|\s*$/g, '''');
  1888.                 var publisherDate = imprintSplit[1].split(", ");
  1889.                 
  1890.                 newItem.publisher = publisherDate[0].replace(/^\s*|\s*$/g, '''');
  1891.                 
  1892.                 if (publisherDate.length > 1) {
  1893.                     
  1894.                     newItem.date = publisherDate[1].replace(/^\s*|\s*$/g, '''');
  1895.                 }
  1896.             } else {
  1897.                 newItem.publisher = dataTags["├ëditeur:"];
  1898.             }
  1899.                         
  1900.         } else if (fieldTitle == "Sujet:") {
  1901.             dataTags[fieldTitle] = contents;
  1902.             
  1903.             if (dataTags["Sujet:"].match("\n")) {
  1904.                 
  1905.                 tagsContent = (dataTags["Sujet:"].split(/\n/));
  1906.                 
  1907.             }        
  1908.             
  1909.          } else {
  1910.     
  1911.             dataTags[fieldTitle] = contents.replace(/^\s*|\s*$/g, '''');
  1912.         }    
  1913.     }
  1914.  
  1915. //pushes tags
  1916.  
  1917.     for (var y = 0; y < tagsContent.length; y++) {
  1918.         if (tagsContent[y]!='''' && tagsContent[y]!= " ") {
  1919.             var parenthesis = tagsContent[y].indexOf("(");
  1920.                  if (parenthesis > 0) {
  1921.                      tagsContent[y] = tagsContent[y].substr(0, parenthesis);
  1922.             }        
  1923.             newItem.tags[y] = tagsContent[y];
  1924.         }
  1925.     }    
  1926.  
  1927. //because newItem is not defined until after the authors have, authors must be put into Zotero outside the main for loop.
  1928.     if (dataTags["author"]) {
  1929.         newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["author"], "author"));
  1930.     }
  1931.         
  1932.     for (var i = 0; i < newItemAuthors1.length; i++) {
  1933.         newItem.creators.push(Zotero.Utilities.cleanAuthor(newItemAuthors1[i], "author"));    
  1934.     }
  1935.     
  1936.     for (var i = 0; i < newItemAuthors2.length; i++) {
  1937.         newItem.creators.push({lastName: newItemAuthors2[i], creatorType: "creator"}); 
  1938.     }
  1939.     
  1940. //trims title as best as possible
  1941.     if (dataTags["Titre:"].match(/\[/)) {    
  1942.         var splitter = dataTags["Titre:"].indexOf("[");
  1943.     }
  1944.     
  1945.     if (dataTags["Titre:"].match("/")) {
  1946.         var splitter1 = dataTags["Titre:"].indexOf("/");
  1947.     }
  1948.     
  1949.     if (splitter1 > -1 && splitter > -1) {
  1950.         if (splitter1 > splitter) {
  1951.             dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter);
  1952.         } else {
  1953.             dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter1);
  1954.         }
  1955.     } else if (splitter1 > -1) {
  1956.         dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter1);
  1957.     } else if (splitter > -1) {
  1958.         dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter);
  1959.     }
  1960.     
  1961.     associateData (newItem, dataTags, "Titre:", "title");
  1962.     associateData (newItem, dataTags, "Num├⌐ro:", "ISBN");
  1963.     associateData (newItem, dataTags, "Description:", "pages");
  1964.     associateData (newItem, dataTags, "Banque:", "repository");
  1965.     associateData (newItem, dataTags, "Langue:", "language");
  1966.     associateData (newItem, dataTags, "Localisation:", "Loc. in Archive");
  1967.     
  1968.     newItem.url = doc.location.href;
  1969.     newItem.complete();
  1970. }
  1971.  
  1972. function doWeb(doc, url) {
  1973.     var namespace = doc.documentElement.namespaceURI;
  1974.     var nsResolver = namespace ? function(prefix) {
  1975.         if (prefix == ''x'') return namespace; else return null;
  1976.     } : null;
  1977.     
  1978.     var articles = new Array();
  1979.     
  1980.     if (detectWeb(doc, url) == "multiple") {
  1981.         var items = new Object();
  1982.         var titles = doc.evaluate(''/html/body/table/tbody/tr/td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1983.         
  1984.         for (var i = 0; i < 4; i++) {
  1985.             var dump = titles.iterateNext();
  1986.         }
  1987.         
  1988.         var next_title;
  1989.  
  1990.         while (next_title = titles.iterateNext()) {
  1991.             items[next_title.href] = next_title.textContent;
  1992.             Zotero.debug(next_title.href);
  1993.             Zotero.debug(next_title.textContent);
  1994.         }
  1995.         items = Zotero.selectItems(items);
  1996.         for (var i in items) {
  1997.             articles.push(i);
  1998.         }
  1999.     } else {
  2000.         articles = [url];
  2001.     }
  2002.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2003.     Zotero.wait();
  2004. }');
  2005. REPLACE INTO translators VALUES ('6f9aa90d-6631-4459-81ef-a0758d2e3921', '1.0.0b4.r5', '', '2008-07-24 05:15:00', '0', '100', '4', 'Blogger', 'Adam Crymble', 'blogspot.com', 
  2006. 'function detectWeb(doc, url) {
  2007.     
  2008.     if (doc.evaluate(''//h3[@class="post-title entry-title"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2009.         var entryCount = doc.evaluate(''count (//h3[@class="post-title entry-title"]/a)'', doc, null, XPathResult.ANY_TYPE, null);
  2010.     }
  2011.     
  2012.     if (entryCount.numberValue == 1) {
  2013.         return "blogPost";
  2014.     } else if (entryCount.numberValue > 1) {
  2015.         return "multiple";
  2016.     }
  2017.     
  2018. }', 
  2019. '//Blogger translator. Code by Adam Crymble
  2020.  
  2021. function scrape(doc, url) {
  2022.  
  2023.     var namespace = doc.documentElement.namespaceURI;
  2024.     var nsResolver = namespace ? function(prefix) {
  2025.         if (prefix == ''x'') return namespace; else return null;
  2026.     } : null;    
  2027.     
  2028.     var tagsContent = new Array();
  2029.     
  2030.     var newItem = new Zotero.Item("blogPost");
  2031.     
  2032.     //title
  2033.         if (doc.evaluate(''//h3[@class="post-title entry-title"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2034.         
  2035.             newItem.title = doc.evaluate(''//h3[@class="post-title entry-title"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2036.         } else {
  2037.             newItem.title = doc.title;
  2038.         }
  2039.     
  2040.     //author, if available
  2041.         if (doc.evaluate(''//span[@class="post-author vcard"]'', doc,  nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2042.             var author = doc.evaluate(''//span[@class="post-author vcard"]'', doc,  nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  2043.             var author = author.toLowerCase();
  2044.             
  2045.             if (author.match(/\sby\s/)) {
  2046.                 var shortenAuthor = author.indexOf(" by");
  2047.                 author = author.substr(shortenAuthor + 3).replace(/^\s*|\s$/g, '''');
  2048.             }
  2049.             var words = author.split(/\s/);
  2050.                 for (var i in words) {
  2051.                     words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  2052.                 }
  2053.             author = words.join(" ");
  2054.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  2055.         }
  2056.     
  2057.     //date, if available
  2058.         if (doc.evaluate(''//h2[@class="date-header"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2059.             newItem.date = doc.evaluate(''//h2[@class="date-header"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2060.             
  2061.         }
  2062.         
  2063.     //tags, if available
  2064.         if (doc.evaluate(''//span[@class="post-labels"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2065.             var tags = doc.evaluate(''//span[@class="post-labels"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2066.             
  2067.             var tags1;
  2068.             while (tags1 = tags.iterateNext()) {
  2069.                 tagsContent.push(tags1.textContent);
  2070.             }
  2071.             
  2072.             for (var i = 0; i < tagsContent.length; i++) {
  2073.                 newItem.tags[i] = tagsContent[i];
  2074.             }
  2075.         }
  2076.         
  2077.     var blogTitle1 = doc.title.split(":");
  2078.     newItem.blogTitle = blogTitle1[0];
  2079.  
  2080.     newItem.url = doc.location.href;
  2081.  
  2082.     newItem.complete();
  2083. }
  2084.  
  2085.  
  2086. function doWeb(doc, url) {
  2087.     var namespace = doc.documentElement.namespaceURI;
  2088.     var nsResolver = namespace ? function(prefix) {
  2089.         if (prefix == ''x'') return namespace; else return null;
  2090.     } : null;
  2091.     
  2092.     var articles = new Array();
  2093.     
  2094.     if (detectWeb(doc, url) == "multiple") {
  2095.         var items = new Object();
  2096.                 
  2097.         var titles = doc.evaluate(''//h3[@class="post-title entry-title"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2098.         var titles1 = doc.evaluate(''//li[@class="archivedate expanded"]/ul[@class="posts"]/li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2099.                 
  2100.         var next_title;
  2101.         while (next_title = titles.iterateNext()) {
  2102.             items[next_title.href] = next_title.textContent;
  2103.         }
  2104.         
  2105.         while (next_title = titles1.iterateNext()) {
  2106.             items[next_title.href] = next_title.textContent;
  2107.         }
  2108.         
  2109.         items = Zotero.selectItems(items);
  2110.         for (var i in items) {
  2111.             articles.push(i);
  2112.         }
  2113.     } else {
  2114.         articles = [url];
  2115.     }
  2116.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2117.     Zotero.wait();
  2118. }');
  2119.  
  2120. REPLACE INTO translators VALUES ('f9373e49-e6ac-46f7-aafe-bb24a2fbc3f0', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'Bracero History Archive', 'Adam Crymble', 'http://braceroarchive.org', 
  2121. 'function detectWeb(doc, url) {
  2122.     if (doc.title.match("Item")) {
  2123.         return "book";
  2124.     } else if (doc.evaluate(''//div[@class="item-meta"]/h2/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2125.         return "multiple";
  2126.     }
  2127. }', 
  2128. '//Bracero History Archive translator; Code by Adam Crymble
  2129.  
  2130. function associateData (newItem, dataTags, field, zoteroField) {
  2131.     if (dataTags[field]) {
  2132.         newItem[zoteroField] = dataTags[field];
  2133.     }
  2134. }
  2135.  
  2136. function scrape(doc, url) {
  2137.  
  2138.     var namespace = doc.documentElement.namespaceURI;
  2139.     var nsResolver = namespace ? function(prefix) {
  2140.         if (prefix == ''x'') return namespace; else return null;
  2141.     } : null;    
  2142.     
  2143.     var dataTags = new Object();
  2144.     var fieldTitle;
  2145.     var contents1;
  2146.  
  2147.     var headers = doc.evaluate(''//h3'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2148.     var contents = doc.evaluate(''//div[@class="field"]/div'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2149.     var xPathCount = doc.evaluate(''count (//div[@class="field"]/div)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2150.  
  2151.     for (i=0; i<xPathCount.numberValue -1; i++) {         
  2152.                  
  2153.              fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  2154.              contents1 = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  2155.   
  2156.              if (contents1.match("Empty")) {
  2157.                  contents1 = '''';
  2158.              }
  2159.              dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents1);
  2160.          }
  2161.  
  2162.    //media type?
  2163.     if (dataTags["TypeName"]) {
  2164.         if (dataTags["TypeName"].match("Oral History")) {
  2165.             Zotero.debug(doc.title);
  2166.             var newItem = new Zotero.Item("audioRecording");
  2167.         } else {
  2168.             var newItem = new Zotero.Item("book");
  2169.         }
  2170.     } else {
  2171.             var newItem = new Zotero.Item("book");
  2172.     }
  2173.     
  2174.    //creators    
  2175.     if (dataTags["Interviewee"] && dataTags["Interviewee"] != '''') {
  2176.         if (dataTags["Interviewee"].match(", ")) {
  2177.             var authors = dataTags["Interviewee"].split(", ");
  2178.             authors = authors[1] + '' '' + authors[0];
  2179.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "interviewee"));
  2180.         } else {
  2181.             newItem.creators.push({lastName: dataTags["Interviewee"], creatorType: "interviewee"});
  2182.         }
  2183.     }
  2184.     
  2185.     if (dataTags["Interviewer"] && dataTags["Interviewer"] != '''') {
  2186.         if (dataTags["Interviewer"].match(", ")) {
  2187.             var authors = dataTags["Interviewer"].split(", ");
  2188.             authors = authors[1] + '' '' + authors[0];
  2189.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "interviewer"));
  2190.         } else {
  2191.             newItem.creators.push({lastName: dataTags["Interviewee"], creatorType: "interviewer"});
  2192.         }
  2193.     }
  2194.     
  2195.     if (dataTags["Creator"] && dataTags["Creator"] != '''') {
  2196.         if (dataTags["Creator"].match(", ")) {
  2197.             var authors = dataTags["Creator"].split(", ");
  2198.             authors = authors[1] + '' '' + authors[0];
  2199.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "creator"));
  2200.         } else {
  2201.             newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Creator"], "creator"));
  2202.         }
  2203.     }
  2204.     
  2205.     if (dataTags["AdditionalCreator"] && dataTags["AdditionalCreator"] != '''') {
  2206.         if (dataTags["AdditionalCreator"].match(", ")) {
  2207.             var authors = dataTags["AdditionalCreator"].split(", ");
  2208.             authors = authors[1] + '' '' + authors[0];
  2209.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "creator"));
  2210.         } else {
  2211.             newItem.creators.push({lastName: dataTags["AdditionalCreator"], creatorType: "creator"});
  2212.         }
  2213.     }
  2214.     
  2215.    //associate    
  2216.     associateData (newItem, dataTags, "Description", "abstractNote");
  2217.     associateData (newItem, dataTags, "Date", "date");
  2218.     associateData (newItem, dataTags, "Publisher", "publisher");
  2219.     associateData (newItem, dataTags, "Source", "place");
  2220.     associateData (newItem, dataTags, "Location", "place");
  2221.     associateData (newItem, dataTags, "RightsHolder", "rights");
  2222.     associateData (newItem, dataTags, "Language", "lang");
  2223.     associateData (newItem, dataTags, "Title:", "title");
  2224.     associateData (newItem, dataTags, "FileNameIdentifier", "callNumber");
  2225.  
  2226.    //tags
  2227.     var tags1;
  2228.     var tagsContent = new Array();
  2229.  
  2230.     if (doc.evaluate(''//li[@class="tag"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2231.          var xPathTags = doc.evaluate(''//li[@class="tag"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2232.          while (tags1 = xPathTags.iterateNext()) {
  2233.              tagsContent.push(tags1.textContent);
  2234.          }
  2235.     }
  2236.  
  2237.     for (var i = 0; i < tagsContent.length; i++) {
  2238.         newItem.tags[i] = tagsContent[i];
  2239.     }
  2240.     
  2241.    //title    
  2242.     newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2243.  
  2244.     newItem.url = doc.location.href;
  2245.     newItem.complete();
  2246. }
  2247.  
  2248. function doWeb(doc, url) {
  2249.     var namespace = doc.documentElement.namespaceURI;
  2250.     var nsResolver = namespace ? function(prefix) {
  2251.         if (prefix == ''x'') return namespace; else return null;
  2252.     } : null;
  2253.     
  2254.     var articles = new Array();
  2255.     var fullRecord = "view=full";
  2256.     var extraChar = "?";
  2257.     
  2258.     if (detectWeb(doc, url) == "multiple") {
  2259.         var items = new Object();
  2260.                 
  2261.         var titles = doc.evaluate(''//div[@class="item-meta"]/h2/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2262.         
  2263.         var next_title;
  2264.         while (next_title = titles.iterateNext()) {
  2265.             items[next_title.href + extraChar + fullRecord] = next_title.textContent;
  2266.         }
  2267.         items = Zotero.selectItems(items);
  2268.         for (var i in items) {
  2269.             articles.push(i);
  2270.         }
  2271.     } else {
  2272.         articles = [url];
  2273.     }
  2274.  
  2275.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2276.     Zotero.wait();
  2277. }');
  2278.  
  2279.  
  2280. REPLACE INTO translators VALUES ('4da40f07-904b-4472-93b6-9bea1fe7d4df', '1.0.0b4.r5', '', '2008-07-24 05:30:00', '0', '100', '4', 'Canada.com', 'Adam Crymble', 'http://www.canada.com', 
  2281. 'function detectWeb(doc, url) {
  2282.     if (doc.location.href.match("story")) {
  2283.         return "newspaperArticle";
  2284.     } else if (doc.location.href.match("search")) {
  2285.         return "multiple";
  2286.     }
  2287. }', 
  2288. '
  2289. function scrape(doc, url) {
  2290.  
  2291.     var namespace = doc.documentElement.namespaceURI;
  2292.     var nsResolver = namespace ? function(prefix) {
  2293.         if (prefix == ''x'') return namespace; else return null;
  2294.     } : null;        
  2295.     
  2296.     var dataTags = new Object();
  2297.     var tagsContent = new Array();
  2298.     var fieldTitle;
  2299.     
  2300.     var newItem = new Zotero.Item("newspaperArticle");
  2301.  
  2302.     newItem.title = doc.title;
  2303.  
  2304.     if (doc.evaluate(''//div[@class="storyheader"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2305.         newItem.abstractNote = doc.evaluate(''//div[@class="storyheader"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2306.     } else if (doc.evaluate(''//div[@class="storyheader"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2307.         newItem.abstracteNote = doc.evaluate(''//div[@class="storyheader"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2308.     }
  2309.  
  2310.     if (doc.evaluate(''//div[@class="feed_details"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2311.         var author = doc.evaluate(''//div[@class="feed_details"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2312.     
  2313.         if (author.match(/\n/)) {
  2314.             author1 = author.split(/\n/);
  2315.             if (author1[0].match(/ and /)) {
  2316.                 author2 = author1[0].split(/ and /);
  2317.                 for (var i in author2) {
  2318.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(author2[i], "author"));    
  2319.                 }
  2320.             } else {
  2321.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[0], "author"));    
  2322.             }
  2323.         } else {
  2324.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  2325.         }
  2326.     }
  2327.         
  2328.     if (doc.evaluate(''//div[@class="feed_details"]/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2329.         var date1 = doc.evaluate(''//div[@class="feed_details"]/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  2330.         if (date1.match("Published:")) {
  2331.             date1 = date1.substr(11);
  2332.             newItem.date = date1;
  2333.         }
  2334.     }    
  2335.     
  2336.     if (doc.evaluate(''//ul[@class="home"]/li/a/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2337.         var pubTitle = doc.evaluate(''//ul[@class="home"]/li/a/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2338.         if (pubTitle.match("Home")) {
  2339.             newItem.publicationTitle = pubTitle.substr(0, pubTitle.length-5);
  2340.         } else {
  2341.             newItem.publicationTitle = pubTitle;
  2342.         }
  2343.     } else {
  2344.         newItem.publicationTitle = "Canada.com";
  2345.     }
  2346.     
  2347.     newItem.url = doc.location.href;
  2348.  
  2349.     newItem.complete();
  2350. }
  2351.  
  2352. function doWeb(doc, url) {
  2353.     var namespace = doc.documentElement.namespaceURI;
  2354.     var nsResolver = namespace ? function(prefix) {
  2355.         if (prefix == ''x'') return namespace; else return null;
  2356.     } : null;
  2357.     
  2358.     var articles = new Array();
  2359.     
  2360.     if (detectWeb(doc, url) == "multiple") {
  2361.         var items = new Object();
  2362.         var next_title;
  2363.         
  2364.         if (doc.evaluate(''//div[@class="even"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2365.         Zotero.debug("AAAAAA");
  2366.             var titles0 = doc.evaluate(''//div[@class="even"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2367.             
  2368.             while (next_title = titles0.iterateNext()) {
  2369.                 if (next_title.href.match("story") && next_title.href.match("canada.com")) {
  2370.                     items[next_title.href] = next_title.textContent;
  2371.                 }
  2372.             }
  2373.         }
  2374.         
  2375.         if (doc.evaluate(''//div[@class="odd"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2376.         Zotero.debug("BBBBB");
  2377.             var titles1 = doc.evaluate(''//div[@class="odd"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2378.             
  2379.             while (next_title = titles1.iterateNext()) {
  2380.                 if (next_title.href.match("story") && next_title.href.match("canada.com")) {
  2381.                     items[next_title.href] = next_title.textContent;
  2382.                 }
  2383.             }
  2384.         }
  2385.         
  2386.         if (doc.evaluate(''//p/b/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2387.             Zotero.debug("CCCCC");
  2388.             var titles2 = doc.evaluate(''//p/b/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2389.             while (next_title = titles2.iterateNext()) {
  2390.                 if (next_title.href.match("story") && next_title.href.match("canada.com")) {
  2391.                     items[next_title.href] = next_title.textContent;
  2392.                 }
  2393.             }
  2394.         }
  2395.         
  2396.         if (doc.evaluate(''//div[@class="name"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  2397.             
  2398.             Zotero.debug("DDDD");
  2399.             var titles3 = doc.evaluate(''//div[@class="name"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2400.             while (next_title = titles3.iterateNext()) {
  2401.                 if (next_title.href.match("story")  && next_title.href.match("canada.com")) {
  2402.                     items[next_title.href] = next_title.textContent;
  2403.                 }
  2404.             }
  2405.         }
  2406.  
  2407.         
  2408.         
  2409.         
  2410.         items = Zotero.selectItems(items);
  2411.         for (var i in items) {
  2412.             articles.push(i);
  2413.         }
  2414.     } else {
  2415.         articles = [url];
  2416.     }
  2417.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2418.     Zotero.wait();
  2419. }');
  2420.  
  2421. REPLACE INTO translators VALUES ('31649d9d-8f7e-4b87-8678-b3e68ee98f39', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'CARL/ABRC OAI Harvester', 'Adam Crymble', 'http://carl-abrc-oai', 
  2422. 'function detectWeb(doc, url) {
  2423.     if (doc.title.match("Search")) {
  2424.         return "multiple";
  2425.     } else if (doc.title.match("Browse")) {
  2426.         return "multiple";
  2427.     } else if (doc.title.match("Record")) {
  2428.         return "book";
  2429.     }
  2430. }', 
  2431. 'function associateData (newItem, dataTags, field, zoteroField) {
  2432.     if (dataTags[field]) {
  2433.         newItem[zoteroField] = dataTags[field];
  2434.     }
  2435. }
  2436.  
  2437. function scrape(doc, url) {
  2438.  
  2439.     var namespace = doc.documentElement.namespaceURI;
  2440.     var nsResolver = namespace ? function(prefix) {
  2441.         if (prefix == ''x'') return namespace; else return null;
  2442.     } : null;    
  2443.     
  2444.     var dataTags = new Object();
  2445.     var allAuthors = new Array();
  2446.     
  2447.     var newItem = new Zotero.Item("book");
  2448.  
  2449.     var metaTagHTML = doc.getElementsByTagName("meta");
  2450.     
  2451.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  2452.         dataTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  2453.         if (metaTagHTML[i].getAttribute("name") == "DC.Creator") {
  2454.             allAuthors.push(dataTags["DC.Creator"]);
  2455.         }
  2456.         
  2457.     }
  2458.     Zotero.debug(allAuthors);
  2459.     
  2460.     for (var i = 0; i < allAuthors.length; i++) {
  2461.         
  2462.         
  2463.         if (allAuthors[i].match(",")) {
  2464.             var authorName = allAuthors[i].split(",");
  2465.             allAuthors[i] = (authorName[1] + (" ") + authorName[0]);
  2466.         
  2467.             if (allAuthors[i].match("; ; ")) {
  2468.                 
  2469.                 allAuthors[i] = allAuthors[i].replace("; ;", '''');
  2470.             }
  2471.                 
  2472.             
  2473.             newItem.creators.push(Zotero.Utilities.cleanAuthor(allAuthors[i], "author"));
  2474.         } else {
  2475.             if (allAuthors[i].match("; ; ")) {
  2476.                 
  2477.                 allAuthors[i] = allAuthors[i].replace("; ;", '''');
  2478.             }
  2479.             
  2480.             newItem.creators.push({lastName: allAuthors[i], creatorType: "creator"}); 
  2481.         }
  2482.         
  2483.         
  2484.     }
  2485.         
  2486.  
  2487.     associateData (newItem, dataTags, "DC.Title", "title");
  2488.     associateData (newItem, dataTags, "DC.Description", "abstractNote");
  2489.     associateData (newItem, dataTags, "DC.Publisher", "publisher");
  2490.     associateData (newItem, dataTags, "DC.Contributor", "extra");
  2491.     associateData (newItem, dataTags, "DC.Date", "date");
  2492.     associateData (newItem, dataTags, "DC.Language", "language");
  2493.  
  2494.     
  2495.     newItem.url = doc.location.href;
  2496.  
  2497.     newItem.complete();
  2498. }
  2499.  
  2500. function doWeb(doc, url) {
  2501.     var namespace = doc.documentElement.namespaceURI;
  2502.     var nsResolver = namespace ? function(prefix) {
  2503.         if (prefix == ''x'') return namespace; else return null;
  2504.     } : null;
  2505.     
  2506.     var articles = new Array();
  2507.     
  2508.     if (detectWeb(doc, url) == "multiple") {
  2509.         var items = new Object();
  2510.         
  2511.         var titles = doc.evaluate(''//span[@class="title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2512.         var links = doc.evaluate(''//div[@class="main"]/div/div/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2513.         
  2514.         var next_title;
  2515.         while (next_title = titles.iterateNext()) {
  2516.             items[links.iterateNext().href] = next_title.textContent;
  2517.             links.iterateNext();
  2518.         }
  2519.         items = Zotero.selectItems(items);
  2520.         for (var i in items) {
  2521.             articles.push(i);
  2522.         }
  2523.     } else {
  2524.         articles = [url];
  2525.     }
  2526.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2527.     Zotero.wait();
  2528. }');
  2529.  
  2530.  
  2531. REPLACE INTO translators VALUES ('50d3ca81-3c4c-406b-afb2-0fe8105b9b38', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'Champlain Society - Collection', 'Adam Crymble', 'http://link.library.utoronto.ca', 
  2532. 'function detectWeb(doc, url) {
  2533.     if (doc.location.href.match("search_results")) {
  2534.         return "multiple";
  2535.     } else if (doc.location.href.match("item_record")) {
  2536.         return "book";
  2537.     }
  2538. }', 
  2539. '//Champlain Collection translator. Code by Adam Crymble
  2540.  
  2541. function associateData (newItem, dataTags, field, zoteroField) {
  2542.     if (dataTags[field]) {
  2543.         newItem[zoteroField] = dataTags[field];
  2544.     }
  2545. }
  2546.  
  2547. function scrape(doc, url) {
  2548.  
  2549.     var namespace = doc.documentElement.namespaceURI;
  2550.     var nsResolver = namespace ? function(prefix) {
  2551.         if (prefix == ''x'') return namespace; else return null;
  2552.     } : null;    
  2553.     
  2554.     var dataTags = new Object();
  2555.     var tagsContent = new Array();
  2556.     var fieldTitle;
  2557.     
  2558.     var newItem = new Zotero.Item("book");
  2559.     
  2560.     var headers = doc.evaluate(''//table[1]/tbody/tr/td[1]/b/font'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2561.     var contents = doc.evaluate(''//td/table[1]/tbody/tr/td[2]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null);    
  2562.     var xPathCount = doc.evaluate(''count (//table[1]/tbody/tr/td[1]/b/font)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2563.  
  2564.     for (i=0; i<xPathCount.numberValue; i++) {         
  2565.              fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  2566.              if (fieldTitle == "Auteur:" ) {
  2567.                  fieldTitle = "Author:";
  2568.              } else if (fieldTitle == "Titre:") {
  2569.                  fieldTitle = "Title:";
  2570.              } else if (fieldTitle == "Description:") {
  2571.                  fieldTitle = "Extent:";
  2572.              } else if (fieldTitle == "├ëditeur:") {
  2573.                  fieldTitle =  "Published:";
  2574.              } else if (fieldTitle == "Sujet:") {
  2575.                  fieldTitle = "Subjects:";
  2576.              }
  2577.              
  2578.               dataTags[fieldTitle] = (contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  2579.          }
  2580.      
  2581. //author
  2582.     var multiAuthors = 0;
  2583.     if (dataTags["Author:"]) {
  2584.         var author = dataTags["Author:"];
  2585.         if (author.match("; ")) {
  2586.             var authors = author.split("; ");
  2587.             multiAuthors = 1;
  2588.         }
  2589.         
  2590.         if (multiAuthors == 1) {
  2591.             for (var i = 0; i < authors.length; i++) {
  2592.                 if (authors[i].match(", ")) {
  2593.                     var author1 = authors[i].split(", ");
  2594.                     author = author1[1] + " " + author1[0];
  2595.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  2596.                 } else {
  2597.                     newItem.creators.push({lastName: author, creatorType: "creator"});
  2598.                 }
  2599.             }
  2600.         } else {
  2601.             if (author.match(", ")) {
  2602.                 var author1 = author.split(", ");
  2603.                 author = author1[1] + " " + author1[0];
  2604.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  2605.             } else {
  2606.                 newItem.creators.push({lastName: author, creatorType: "creator"});
  2607.             }
  2608.         }
  2609.     }
  2610.     
  2611.     if (dataTags["Published:"]) {
  2612.         if (dataTags["Published:"].match(": ")) {
  2613.             var place1 = dataTags["Published:"].indexOf(": ");
  2614.             newItem.place = dataTags["Published:"].substr(0, place1);
  2615.             var publisher1 = dataTags["Published:"].substr(place1 + 2);
  2616.             
  2617.             if (publisher1.match(", ")) {
  2618.                 var date1 = publisher1.lastIndexOf(", ");
  2619.                 newItem.date = publisher1.substr(date1 +2);
  2620.                 newItem.publisher = publisher1.substr(0, date1);
  2621.             } else {
  2622.                 newItem.publisher = publisher1;
  2623.             }
  2624.         } else {
  2625.             newItem.publisher = publisher1;
  2626.         }
  2627.     }                
  2628.     
  2629. //for Tags
  2630.     if (dataTags["Subjects:"]) {
  2631.         tagsContent = dataTags["Subjects:"].split(/\n/);
  2632.     }
  2633.  
  2634.     var j = 0;
  2635.     for (var i = 0; i < tagsContent.length; i++) {
  2636.         if (tagsContent[i].match(/\w/)) {
  2637.             newItem.tags[j] = tagsContent[i].replace(/^\s*|\s+$/g, '''');
  2638.             j++;
  2639.         }
  2640.     }
  2641.     
  2642.     associateData (newItem, dataTags, "Extent:", "pages");
  2643.     associateData (newItem, dataTags, "ID:", "callNumber");
  2644.     associateData (newItem, dataTags, "Notes:", "abstractNote");
  2645.  
  2646.     newItem.title = doc.title;    
  2647.     if (dataTags["Title:"]) {
  2648.         associateData (newItem, dataTags, "Title:", "title");
  2649.     } else {
  2650.         newItem.title = "No Title Found: Champlain Collection";
  2651.     }
  2652.  
  2653.     newItem.url = doc.location.href;
  2654.  
  2655.     newItem.complete();
  2656. }
  2657.  
  2658. function doWeb(doc, url) {
  2659.     var namespace = doc.documentElement.namespaceURI;
  2660.     var nsResolver = namespace ? function(prefix) {
  2661.         if (prefix == ''x'') return namespace; else return null;
  2662.     } : null;
  2663.     
  2664.     var articles = new Array();
  2665.     
  2666.     if (detectWeb(doc, url) == "multiple") {
  2667.         var items = new Object();
  2668.         
  2669.         var titles = doc.evaluate(''//tr[1]/td[2]/font/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2670.         
  2671.         var next_title;
  2672.         while (next_title = titles.iterateNext()) {
  2673.             items[next_title.href] = next_title.textContent;
  2674.         }
  2675.         items = Zotero.selectItems(items);
  2676.         for (var i in items) {
  2677.             articles.push(i);
  2678.         }
  2679.     } else {
  2680.         articles = [url];
  2681.     }
  2682.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2683.     Zotero.wait();
  2684. }');
  2685.  
  2686.  
  2687. REPLACE INTO translators VALUES ('8451431a-895f-4732-8339-79eb6756d2f9', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'Civilization.ca', 'Adam Crymble', 'http://collections.civilization.ca', 
  2688. 'function detectWeb(doc, url) {
  2689.     if (doc.evaluate(''//tr/td[2]/a/font'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2690.         return "multiple";
  2691.     } else if (doc.location.href.match("Display.php")) {
  2692.         return "artwork";
  2693.     }
  2694. }', 
  2695. '//Civilization.ca translator. Code by Adam Crymble.
  2696.  
  2697. function associateData (newItem, dataTags, field, zoteroField) {
  2698.     if (dataTags[field]) {
  2699.         newItem[zoteroField] = dataTags[field];
  2700.     }
  2701. }
  2702.  
  2703. function scrape(doc, url) {
  2704.  
  2705.     var namespace = doc.documentElement.namespaceURI;
  2706.     var nsResolver = namespace ? function(prefix) {
  2707.         if (prefix == ''x'') return namespace; else return null;
  2708.     } : null;    
  2709.     
  2710.     var dataTags = new Object();
  2711.     var tagsContent = new Array();
  2712.     var fieldTitle;
  2713.     
  2714.     var newItem = new Zotero.Item("artwork");
  2715.     
  2716.     var headers = doc.evaluate(''//table[2]/tbody/tr/td[1]/span[@class="textb"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2717.     var contents = doc.evaluate(''//tr[2]/td/table[2]/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2718.     var xPathCount = doc.evaluate(''count (//table[2]/tbody/tr/td[1]/span[@class="textb"]/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2719.  
  2720.     newItem.title = contents.iterateNext().textContent.replace(/^\s*|\s+$/g, '''');
  2721.     var dump = contents.iterateNext();
  2722.  
  2723.     for (i=0; i<xPathCount.numberValue; i++) {         
  2724.                  
  2725.              fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  2726.              if (fieldTitle == "Artist/Maker/Manufacturer") {
  2727.                  fieldTitle = "    Artiste/Artisan/Fabricant";
  2728.              } else if (fieldTitle == "Autreaffiliationculturelle") {
  2729.                  fieldTitle = "OtherCulturalAffiliation";
  2730.              }
  2731.              
  2732.               dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  2733.          }
  2734.  
  2735.     if (dataTags["Artist/Maker/Manufacturer"]) {
  2736.         var author = dataTags["Artist/Maker/Manufacturer"];
  2737.         if (author.match(" and ")) {
  2738.             var authors = author.split(" and ");
  2739.             for (var i in authors) {
  2740.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));    
  2741.             }
  2742.         } else {
  2743.             newItem.creators.push({lastName: author, creatorType: "creator"});                
  2744.         }
  2745.     }
  2746.  
  2747.     if (dataTags["OtherCulturalAffiliation"]) {
  2748.         tagsContent = dataTags["OtherCulturalAffiliation"].split(/\n/);
  2749.  
  2750.         for (var i = 0; i < tagsContent.length; i++) {
  2751.                      newItem.tags[i] = tagsContent[i];
  2752.              }
  2753.     }
  2754.     
  2755.     if (dataTags["Collection"]) {
  2756.         newItem.extra = "Collection: " + dataTags[''Collection''];
  2757.     }
  2758.     
  2759.     associateData (newItem, dataTags, "ArtifactNumber", "callNumber");
  2760.     associateData (newItem, dataTags, "Museum", "repository");
  2761.     associateData (newItem, dataTags, "Measurements", "artworkSize");
  2762.     associateData (newItem, dataTags, "BeginDate", "date");
  2763.     associateData (newItem, dataTags, "EndDate", "date");
  2764.     associateData (newItem, dataTags, "AdditionalInformation", "abstractNote");
  2765.     
  2766.     associateData (newItem, dataTags, "Num├⌐rod''artefact", "callNumber");
  2767.     associateData (newItem, dataTags, "Mus├⌐e", "repository");
  2768.     associateData (newItem, dataTags, "Mesures", "artworkSize");
  2769.     associateData (newItem, dataTags, "Dateded├⌐but", "date");
  2770.     associateData (newItem, dataTags, "Datedefin", "date");
  2771.     associateData (newItem, dataTags, "Informationsuppl├⌐mentaire", "abstractNote");
  2772.     
  2773.     newItem.url = doc.location.href;
  2774.     newItem.complete();
  2775. }
  2776.  
  2777. function doWeb(doc, url) {
  2778.     var namespace = doc.documentElement.namespaceURI;
  2779.     var nsResolver = namespace ? function(prefix) {
  2780.         if (prefix == ''x'') return namespace; else return null;
  2781.     } : null;
  2782.     
  2783.     var articles = new Array();
  2784.     
  2785.     if (detectWeb(doc, url) == "multiple") {
  2786.         var items = new Object();
  2787.     
  2788.         var titles = doc.evaluate(''//tr/td[2]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2789.     
  2790.         var next_title;
  2791.         while (next_title = titles.iterateNext()) {
  2792.             if (next_title.textContent.match(/\w/)) {
  2793.                 items[next_title.href] = next_title.textContent;
  2794.             }
  2795.         }
  2796.         items = Zotero.selectItems(items);
  2797.         for (var i in items) {
  2798.             articles.push(i);
  2799.         }
  2800.     } else {
  2801.         articles = [url];
  2802.     }
  2803.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2804.     Zotero.wait();
  2805. }');
  2806.  
  2807.  
  2808. REPLACE INTO translators VALUES ('625c6435-e235-4402-a48f-3095a9c1a09c', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'DBLP Computer Science Bibliography', 'Adam Crymble', 'http://(search?|dblp?).mpi-inf', 
  2809. 'function detectWeb(doc, url) {
  2810.     if (doc.title.match("journals")) {
  2811.         return "journalArticle";
  2812.     } else if (doc.title.match("conf")) {
  2813.         return "conferencePaper";
  2814.     } else if (doc.title.match("DBLP entry")) {
  2815.         return "bookSection";
  2816.     }
  2817. }
  2818. ', 
  2819. '//DBLP Computer Science Database Translator. Code by Adam Crymble.
  2820. //Doesn''t work for multiple entries. Site uses a different URL for the search and single entry. Multiple code attached as comment.
  2821.  
  2822. function associateData (newItem, dataTags, field, zoteroField) {
  2823.     if (dataTags[field]) {
  2824.         newItem[zoteroField] = dataTags[field];
  2825.     }
  2826. }
  2827.  
  2828. function scrape(doc, url) {
  2829.  
  2830.     var namespace = doc.documentElement.namespaceURI;
  2831.     var nsResolver = namespace ? function(prefix) {
  2832.     } : null;    
  2833.     
  2834.     var dataTags = new Object();
  2835.     
  2836.     var mediaType = detectWeb(doc, url);
  2837.     
  2838.     if (mediaType == "bookSection") {
  2839.         var newItem = new Zotero.Item("bookSection");
  2840.     } else if (mediaType == "conferencePaper") {
  2841.         var newItem = new Zotero.Item("conferencePaper");
  2842.     } else if (mediaType == "journalArticle") {
  2843.         var newItem = new Zotero.Item("journalArticle");
  2844.     }
  2845.     
  2846.     var xPathAllData = doc.evaluate(''//pre'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2847.     var allData = xPathAllData.iterateNext().textContent.split("},");
  2848.     
  2849.     var cleanFirstEntry = allData[0].indexOf(",");
  2850.     allData[0] = allData[0].substr(cleanFirstEntry);
  2851.  
  2852.     var headers = new Array();
  2853.     var content = new Array();
  2854.     var splitAllData;
  2855.     
  2856.     for (var i = 0; i < allData.length-2; i++) {
  2857.         splitAllData = allData[i].split("=");
  2858.         headers.push(splitAllData[0].replace(/^\s*|\s*$|\W*/g, ''''));
  2859.         content.push(splitAllData[1].replace(/^\s*|\s*$|\{*/g, ''''));
  2860.         
  2861.         fieldTitle = headers[i].replace(",", '''');
  2862.     
  2863.         if (fieldTitle == "author") {
  2864.             var authors = content[i].split("and");
  2865.     
  2866.             for (var j =0; j<authors.length; j++) {
  2867.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
  2868.             }
  2869.         } else if (fieldTitle == "editor") {
  2870.             var editors = content[i].split("and");
  2871.  
  2872.             for (var j =0; j<editors.length; j++) {
  2873.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(editors[j], "editor"));
  2874.             }
  2875.         } else {
  2876.  
  2877.             dataTags[fieldTitle] = content[i];
  2878.         }
  2879.     }
  2880.  
  2881.     if (mediaType == "conferencePaper") {
  2882.         associateData (newItem, dataTags, "booktitle", "conferenceName");
  2883.     } else {
  2884.         associateData (newItem, dataTags, "booktitle", "bookTitle");
  2885.     }
  2886.     
  2887.     newItem.url = doc.location.href;
  2888.     
  2889.     associateData (newItem, dataTags, "year", "date");
  2890.     associateData (newItem, dataTags, "pages", "pages");
  2891.     associateData (newItem, dataTags, "title", "title");    
  2892.     associateData (newItem, dataTags, "publisher", "publisher");
  2893.     associateData (newItem, dataTags, "volume", "volume");
  2894.     associateData (newItem, dataTags, "isbn", "ISBN");
  2895.     associateData (newItem, dataTags, "series", "series");
  2896.     associateData (newItem, dataTags, "journal", "publicationTitle");
  2897.     associateData (newItem, dataTags, "number", "issue");
  2898.  
  2899.     newItem.complete();
  2900.  
  2901. }
  2902.  
  2903.  
  2904.  
  2905. function doWeb(doc, url) {
  2906.     var namespace = doc.documentElement.namespaceURI;
  2907.     var nsResolver = namespace ? function(prefix) {
  2908.         if (prefix == ''x'') return namespace; else return null;
  2909.     } : null;
  2910.     
  2911.     var articles = new Array();
  2912.     
  2913.     /* Multiple code doesn''t work due to Permission denied to get property HTMLDocument.documentElement error.
  2914.     
  2915.     if (detectWeb(doc, url) == "multiple") {
  2916.         var items = new Object();
  2917.         
  2918.         //newer interface xPaths
  2919.         if (doc.title.match("DEMO")) {
  2920.             
  2921.             var titles = doc.evaluate(''//a/font'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2922.             var links = doc.evaluate(''//dt/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2923.             
  2924.             var next_title;
  2925.             while (next_title = titles.iterateNext()) {
  2926.                 items[links.iterateNext().href] = next_title.textContent;
  2927.             }
  2928.             
  2929.         //older interface xPaths    
  2930.         } else {
  2931.                 
  2932.             var titles = doc.evaluate(''//td[3]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2933.             var links = doc.evaluate(''//td[1]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2934.             
  2935.             var next_title;
  2936.             var split1;
  2937.             var split2;
  2938.             
  2939.             while (next_title = titles.iterateNext()) {
  2940.                 
  2941.                 split1 = next_title.textContent.indexOf(":");
  2942.                 var title = next_title.textContent.substr(split1+2);
  2943.                 split2 = title.indexOf(".");
  2944.                 title = title.substr(0, split2);
  2945.             
  2946.                 items[links.iterateNext().href] = title;
  2947.             }
  2948.         
  2949.         }
  2950.  
  2951.         items = Zotero.selectItems(items);
  2952.         for (var i in items) {
  2953.             articles.push(i);
  2954.         }
  2955.         
  2956.     } else {
  2957.     
  2958.         */
  2959.         
  2960.         articles = [url];
  2961.     //}
  2962.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  2963.     Zotero.wait();
  2964. }');
  2965.  
  2966.  
  2967. REPLACE INTO translators VALUES ('00ce0d68-9205-40e6-91f4-c96f7ab296c2', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'Eighteenth Century Collections Online', 'Adam Crymble', 'http://galenet.galegroup.com', 
  2968. 'function detectWeb(doc, url) {
  2969.     if (doc.evaluate(''//td[2][@class="stnd"]/a/i/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2970.         return "multiple";
  2971.     } else if (doc.evaluate(''//td[3]/span[@class="stnd"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2972.         return "bookSection";
  2973.     } else if (doc.evaluate(''//span[@class="stnd"]/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2974.         return "book";
  2975.     }
  2976. }
  2977. ', 
  2978. '//Eighteenth Century Collections Online translator. Code by Adam Crymble
  2979.  
  2980.  
  2981. function associateData (newItem, dataTags, field, zoteroField) {
  2982.     if (dataTags[field]) {
  2983.         newItem[zoteroField] = dataTags[field];
  2984.     }
  2985. }
  2986.  
  2987. function scrape(doc, url) {
  2988.  
  2989.     var namespace = doc.documentElement.namespaceURI;
  2990.     var nsResolver = namespace ? function(prefix) {
  2991.         if (prefix == ''x'') return namespace; else return null;
  2992.     } : null;    
  2993.     
  2994.     var dataTags = new Object();
  2995.     var tagsContent = new Array();
  2996.     var fieldTitle;
  2997.     
  2998.     var newItem = new Zotero.Item("book");
  2999.  
  3000.     var headers = doc.evaluate(''//td[1][@class="stnd"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3001.     var contents = doc.evaluate(''//td[2][@class="stnd"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3002.     
  3003.     while (fieldTitle = headers.iterateNext()) {
  3004.         
  3005.         fieldTitle = fieldTitle.textContent.replace(/\s+/g, '''');
  3006.         fieldContent = contents.iterateNext().textContent;
  3007.         
  3008.         while (fieldContent.length<2) {
  3009.             if (fieldContent.match(/\d/)) {
  3010.                 break;
  3011.             } else {
  3012.                 fieldContent = contents.iterateNext().textContent;    
  3013.             }            
  3014.         }
  3015.         dataTags[fieldTitle] = fieldContent.replace(/^\s*|\s*$/g, '''');        
  3016.     }
  3017.         
  3018.     if (dataTags["Author"]) {
  3019.         if (dataTags["Author"].match(/\n/)) {
  3020.             var author = dataTags["Author"].split(/\n/);
  3021.             dataTags["Author"] = author[0];
  3022.  
  3023.         }
  3024.         if (dataTags["Author"].match(", ")) {
  3025.             var author = dataTags["Author"].split(", ");
  3026.             author = author[1] + " " + author[0];
  3027.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  3028.         } else {
  3029.             newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Author"], "author"));    
  3030.         }
  3031.     }
  3032.     
  3033.     if (dataTags["GaleDocumentNumber"]) {
  3034.         newItem.extra = "Gale Document Number: " + dataTags["GaleDocumentNumber"];
  3035.     }
  3036.     
  3037.     if (dataTags["18thCenturyMicrofilmReel#"]) {
  3038.         newItem.locInArchive = "18th Century Microfilm Reel #: " + dataTags["18thCenturyMicrofilmReel#"];
  3039.     }
  3040.     
  3041.     if (dataTags["Imprint"]) {
  3042.         if (dataTags["Imprint"].match(": ")) {
  3043.             var place1 = dataTags["Imprint"].split(": ");
  3044.             newItem.place = place1[0];
  3045.             if (place1[1].match(", ")) {
  3046.                 var pub1 = place1[1].split(", ");
  3047.                 newItem.publisher = pub1[0];
  3048.                 newItem.date = pub1[1];
  3049.             } else {
  3050.                 newItem.publisher = place1[1];
  3051.             }
  3052.         } else {
  3053.             newItem.publisher = dataTags["Imprint"];
  3054.         }
  3055.     }
  3056.     
  3057.     associateData (newItem, dataTags, "Title", "title");
  3058.     associateData (newItem, dataTags, "Language", "language");
  3059.     associateData (newItem, dataTags, "Pages", "page");
  3060.     associateData (newItem, dataTags, "SourceLibrary", "repository");
  3061.     associateData (newItem, dataTags, "Volume", "volume");
  3062.     associateData (newItem, dataTags, "Notes", "abstractNote");
  3063.  
  3064.     newItem.url = doc.location.href;
  3065.  
  3066.     newItem.complete();
  3067. }
  3068.  
  3069. function doWeb(doc, url) {
  3070.     var namespace = doc.documentElement.namespaceURI;
  3071.     var nsResolver = namespace ? function(prefix) {
  3072.         if (prefix == ''x'') return namespace; else return null;
  3073.     } : null;
  3074.     
  3075.     var items = new Object();    
  3076.     var articles1 = new Array();
  3077.     
  3078.     if (detectWeb(doc, url) == "multiple") {
  3079.         var titles = doc.evaluate(''//td[2][@class="stnd"]/a/i/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3080.         var links = doc.evaluate(''//td[2][@class="stnd"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3081.         
  3082.         var next_title;
  3083.         while (next_title = titles.iterateNext()) {
  3084.             var link = links.iterateNext();
  3085.                 
  3086.             while (link.textContent!="Full Citation") {
  3087.                 link = links.iterateNext();
  3088.             }
  3089.             
  3090.             items[link.href] = next_title.textContent;
  3091.         }
  3092.         
  3093.         items = Zotero.selectItems(items);
  3094.         for (var i in items) {
  3095.             articles1.push(i);
  3096.         }
  3097.         
  3098.     } else if (detectWeb(doc, url) == "bookSection") {
  3099.     
  3100.         var links = doc.evaluate(''//td[3]/span[@class="stnd"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3101.         
  3102.         var articles = links.iterateNext();
  3103.         Zotero.debug(articles);
  3104.         
  3105.         articles1.push(articles.href);
  3106.         
  3107.     } else {
  3108.         articles1 = [url];
  3109.     }
  3110.     
  3111.     Zotero.Utilities.processDocuments(articles1, scrape, function() {Zotero.done();});
  3112.     Zotero.wait();
  3113. }');
  3114.  
  3115.  
  3116. REPLACE INTO translators VALUES ('879d738c-bbdd-4fa0-afce-63295764d3b7', '1.0.0b4.r5', '', '2008-09-02 13:40:00', '0', '100', '4', 'FreePatentsOnline', 'Adam Crymble', 'http://www.freepatentsonline.com', 
  3117. 'function detectWeb(doc, url) {
  3118.     if (doc.location.href.match("result.html")) {
  3119.         return "multiple";
  3120.     } else if (doc.evaluate(''//div[@class="disp_doc2"]/div'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3121.         return "patent";
  3122.     }
  3123. }', 
  3124. 'function associateData (newItem, dataTags, field, zoteroField) {
  3125.     if (dataTags[field]) {
  3126.         newItem[zoteroField] = dataTags[field];
  3127.     }
  3128. }
  3129.  
  3130. function scrape(doc, url) {
  3131.  
  3132.     var namespace = doc.documentElement.namespaceURI;
  3133.     var nsResolver = namespace ? function(prefix) {
  3134.         if (prefix == ''x'') return namespace; else return null;
  3135.     } : null;    
  3136.     
  3137.     var dataTags = new Object();
  3138.     var fieldTitle;
  3139.     var contents;
  3140.     
  3141.     var newItem = new Zotero.Item("patent");
  3142.  
  3143.     var pageContent = doc.evaluate(''//div[@class="disp_doc2"]/div'', doc, null, XPathResult.ANY_TYPE, null);
  3144.     var xPathCount = doc.evaluate(''count (//div[@class="disp_doc2"]/div)'', doc, null, XPathResult.ANY_TYPE, null);
  3145.     
  3146.  
  3147.     for (i=0; i<xPathCount.numberValue/2; i++) {         
  3148.                  
  3149.              fieldTitle = pageContent.iterateNext().textContent.replace(/\s+/g, '''');
  3150.              content = pageContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  3151.              dataTags[fieldTitle] = (content);
  3152.          }
  3153.     
  3154.     var inventors = new Array();
  3155.     var parenthesis;
  3156.     
  3157.     if (dataTags["Inventors:"]) {
  3158.         inventors = dataTags["Inventors:"].split(/\n/);
  3159.         if (inventors.length>1) {
  3160.             for (var i = 0; i < inventors.length; i++) {
  3161.                     parenthesis = inventors[i].indexOf("(");
  3162.                     inventors[i] = inventors[i].substr(0, parenthesis).replace(/^\s*|\s*$/g, '''');            
  3163.                 if (inventors[i].match(", ")) {
  3164.                     var inventors1 = inventors[i].split(", ");
  3165.                     inventors[i] = inventors1[1] + " " + inventors1[0];
  3166.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(inventors[i], "inventor"));
  3167.                 } else {
  3168.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(inventors[i], "inventor"));
  3169.                 }
  3170.             }
  3171.             
  3172.         } else {
  3173.             Zotero.debug(doc.title);
  3174.             parenthesis = dataTags["Inventors:"].indexOf("(");
  3175.             dataTags["Inventors:"] = dataTags["Inventors:"].substr(0, parenthesis).replace(/^\s*|\s*$/g, '''');
  3176.             
  3177.             if (dataTags["Inventors:"].match(", ")) {
  3178.                 var inventors1 = dataTags["Inventors:"].split(", ");
  3179.                 dataTags["Inventors:"] = inventors1[1] + " " + inventors1[0];
  3180.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventors:"], "inventor"));
  3181.             } else {
  3182.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventors:"], "inventor"));
  3183.             }
  3184.         }
  3185.     }
  3186.  
  3187.     associateData (newItem, dataTags, "Title:", "title");
  3188.     associateData (newItem, dataTags, "Abstract:", "abstract");
  3189.     associateData (newItem, dataTags, "DocumentTypeandNumber:", "patentNumber");
  3190.     associateData (newItem, dataTags, "ApplicationNumber:", "applicationNumber");
  3191.     associateData (newItem, dataTags, "PublicationDate:", "issueDate");
  3192.     associateData (newItem, dataTags, "Assignee:", "assignee");
  3193.     
  3194.     newItem.url = doc.location.href;
  3195.  
  3196.     newItem.complete();
  3197. }
  3198.  
  3199.  
  3200. function doWeb(doc, url) {
  3201.     var namespace = doc.documentElement.namespaceURI;
  3202.     var nsResolver = namespace ? function(prefix) {
  3203.         if (prefix == ''x'') return namespace; else return null;
  3204.     } : null;
  3205.     
  3206.     var articles = new Array();
  3207.     
  3208.     if (detectWeb(doc, url) == "multiple") {
  3209.         var items = new Object();
  3210.                 
  3211.         var titles = doc.evaluate(''//table[@class="listing_table"]/tbody/tr/td[3]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3212.         
  3213.         var next_title;
  3214.         while (next_title = titles.iterateNext()) {
  3215.             items[next_title.href] = next_title.textContent;
  3216.         }
  3217.         items = Zotero.selectItems(items);
  3218.         for (var i in items) {
  3219.             articles.push(i);
  3220.         }
  3221.     } else {
  3222.         articles = [url];
  3223.     }
  3224.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  3225.     Zotero.wait();
  3226. }');
  3227.  
  3228.  
  3229. REPLACE INTO translators VALUES ('4ea89035-3dc4-4ae3-b22d-726bc0d83a64', '1.0.0b4.r5', '', '2008-07-24 05:30:00', '0', '100', '4', 'Gale - Cengage Learning', 'Adam Crymble', 'http://www.gale.cengage.com', 
  3230. 'function detectWeb(doc, url) {
  3231.     
  3232.     if (doc.evaluate(''//td[3]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3233.         return "multiple";
  3234.     } else if (doc.evaluate(''//div[@id="title_main"]/h2'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3235.         return "book";
  3236.     }
  3237.     
  3238.     
  3239.     
  3240. }', 
  3241. '//Gale Cengage Learning - Catalog translator. Code by Adam Crymble.
  3242.  
  3243. function associateData (newItem, dataTags, field, zoteroField) {
  3244.     if (dataTags[field]) {
  3245.         newItem[zoteroField] = dataTags[field];
  3246.     }
  3247. }
  3248.  
  3249. function scrape(doc, url) {
  3250.  
  3251.     var namespace = doc.documentElement.namespaceURI;
  3252.     var nsResolver = namespace ? function(prefix) {
  3253.         if (prefix == ''x'') return namespace; else return null;
  3254.     } : null;    
  3255.     
  3256.     var dataTags = new Object();
  3257.     var titles1;
  3258.     
  3259.     var newItem = new Zotero.Item("book");
  3260.     
  3261.     var credits = doc.evaluate(''//div[@id="credits"]/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3262.     var xPathCount = doc.evaluate(''count (//div[@id="credits"]/ul/li)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3263.     
  3264.     var creditsArray = new Array();
  3265.     
  3266.     for (var i = 0; i < xPathCount.numberValue; i++) {
  3267.         creditsArray.push(credits.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));    
  3268.     }
  3269.  
  3270.     if (doc.evaluate(''//div[@id="title_main"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3271.         titles1 = doc.evaluate(''//div[@id="title_main"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  3272.     }
  3273.     
  3274.     if (titles1.match(/\w/) && creditsArray[0].match(/\w/)) {
  3275.         newItem.title = titles1 + ": " + creditsArray[0];
  3276.     } else if (titles1.match(/\w/) && !creditsArray[0].match(/\w/)) {
  3277.         newItem.title = titles1;
  3278.     } else {
  3279.         newItem.title = "No Title Found."
  3280.     }
  3281.     
  3282.     for (var i = 1; i < creditsArray.length; i++) {
  3283.         
  3284.         if (creditsArray[i].match("Author ")) {
  3285.             var author = creditsArray[i].split("Author ");
  3286.             author = author[1];
  3287.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  3288.         } else if (creditsArray[i].match("Published by ")) {
  3289.             var  publisher1 = creditsArray[i].split("Published by ");
  3290.             newItem.publisher = publisher1[1];
  3291.         } else if (creditsArray[i].match("Volume")) {
  3292.             var volume1 = creditsArray[i].split("Volume");
  3293.             newItem.volume = volume1[1];
  3294.         }
  3295.         
  3296.     }
  3297.     
  3298.     if (doc.evaluate(''//div[@id="description"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3299.         newItem.abstractNote = doc.evaluate(''//div[@id="description"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3300.     }
  3301.     
  3302.     var pageContents = doc.evaluate(''//div[@id="detail"]/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3303.     
  3304.     var allContents = new Array();
  3305.     var contents;
  3306.     var fieldTitle;
  3307.     
  3308.     while (contents = pageContents.iterateNext()) {
  3309.         allContents.push(contents.textContent);
  3310.     }
  3311.     
  3312.     for (i=0; i<allContents.length; i++) {         
  3313.         if  (allContents[i].match(":")) {
  3314.             contents = allContents[i].split(":");
  3315.             fieldTitle = contents[0].replace(/\s*/g, '''');
  3316.             dataTags[fieldTitle] = contents[1];
  3317.         }
  3318.          }
  3319.  
  3320.     associateData (newItem, dataTags, "ISBN10", "ISBN");
  3321.     if (dataTags["ISBN13"]) {
  3322.         newItem.extra = "ISBN 13: " + dataTags["ISBN13"];
  3323.     }
  3324.     associateData (newItem, dataTags, "Published/Released", "date");
  3325.  
  3326.     newItem.url = doc.location.href;
  3327.     newItem.complete();
  3328. }
  3329.  
  3330. function doWeb(doc, url) {
  3331.     var namespace = doc.documentElement.namespaceURI;
  3332.     var nsResolver = namespace ? function(prefix) {
  3333.         if (prefix == ''x'') return namespace; else return null;
  3334.     } : null;
  3335.     
  3336.     var articles = new Array();
  3337.     
  3338.     if (detectWeb(doc, url) == "multiple") {
  3339.         var items = new Object();
  3340.  
  3341.         var titles = doc.evaluate(''//td[3]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3342.  
  3343.         var next_title;
  3344.         while (next_title = titles.iterateNext()) {
  3345.             items[next_title.href] = next_title.textContent;
  3346.         }
  3347.         items = Zotero.selectItems(items);
  3348.         for (var i in items) {
  3349.             articles.push(i);
  3350.         }
  3351.     } else {
  3352.         articles = [url];
  3353.     }
  3354.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  3355.     Zotero.wait();
  3356. }');
  3357.  
  3358.  
  3359. REPLACE INTO translators VALUES ('f87c10fe-2bdc-4e1e-aedd-7fd20ec4b4c2', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'Getty Research Library Catalog', 'Adam Crymble', 'http://(opac.pub|library).getty.edu', 
  3360. 'function detectWeb(doc, url) {
  3361.     
  3362.     var  multiCheck = '''';
  3363.     
  3364.     if (doc.evaluate(''//table/tbody/tr/td[1]/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3365.         
  3366.         multiCheck = doc.evaluate(''//table/tbody/tr/td[1]/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3367.     }
  3368.     
  3369.     var callNumSearch = '''';
  3370.     if (doc.evaluate(''//table/tbody/tr/th[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3371.         callNumSearch = doc.evaluate(''//table/tbody/tr/th[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3372.     }
  3373.     
  3374.     if (callNumSearch.match("Call Number")) {
  3375.         return "multiple";
  3376.     }
  3377.     
  3378.     if (multiCheck.match("Sort by:")) {
  3379.         return "multiple";
  3380.     }
  3381.     
  3382.     if (doc.evaluate(''//table[2]/tbody/tr/th'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match("Author:")) {
  3383.         return "book";
  3384.     } else if (doc.evaluate(''//tr/th/font/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3385.         return "book";
  3386.     } else if (doc.evaluate(''//tr/th/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3387.         return "book";
  3388.     }
  3389. }', 
  3390. '//Getty Research Library Catalog translator. Code by Adam Crymble
  3391.  
  3392. function associateData (newItem, dataTags, field, zoteroField) {
  3393.     if (dataTags[field]) {
  3394.         newItem[zoteroField] = dataTags[field];
  3395.     }
  3396. }
  3397.  
  3398. function scrape(doc, url) {
  3399.  
  3400.     var namespace = doc.documentElement.namespaceURI;
  3401.     var nsResolver = namespace ? function(prefix) {
  3402.         if (prefix == ''x'') return namespace; else return null;
  3403.     } : null;    
  3404.     
  3405.     var dataTags = new Object();
  3406.     
  3407.     var fieldContent = new Array();
  3408.     var fieldExtra = new Array();
  3409.     var tagsContent = new Array();
  3410.     var multis = new Array();
  3411.     
  3412.     var content1;
  3413.     var extra1;
  3414.     var multi1;
  3415.     
  3416.     var newItem = new Zotero.Item("book");
  3417.     
  3418.     var multiLineEntry = doc.evaluate(''//table[2]/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3419.     while (multi1 = multiLineEntry.iterateNext()) {
  3420.         multis.push(multi1.textContent);
  3421.     }
  3422.     
  3423.     //Puts field Content into an array
  3424.     var contents = doc.evaluate(''//table[2]/tbody/tr/td'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3425.     while (content1 = contents.iterateNext()) {
  3426.         if (content1.textContent.match(/\w/)) {
  3427.             fieldContent.push(content1.textContent.replace(/^\s*|\s*&/g, ''''));
  3428.         }
  3429.     }
  3430.     
  3431.     //Entries that do not line up perfectly with a field heading are put into an array and these are then removed from the field Content array.
  3432.     var extraField = doc.evaluate(''//table[2]/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3433.     while (extra1 = extraField.iterateNext()) {
  3434.         if (extra1.textContent.match(/\w/)) {
  3435.             fieldExtra.push(extra1.textContent.replace(/^\s*|\s*&/g, ''''));
  3436.         }
  3437.     }    
  3438.     
  3439.     var duplicates = new Array();
  3440.     for (var i = 0; i < fieldContent.length; i++) {
  3441.         for (var j = 0; j < fieldExtra.length; j++) {
  3442.             if (fieldContent[i] == fieldExtra[j]) {
  3443.                 duplicates.push(i);
  3444.             }
  3445.         }
  3446.     }
  3447.     var cleanContent = new Array();
  3448.     
  3449.     for (var i = duplicates.length-1; i > -1; i --) {
  3450.     
  3451.         fieldContent[duplicates[i]-1] = fieldContent[duplicates[i]-1] + "; " + fieldContent[duplicates[i]];
  3452.         fieldContent[duplicates[i]] = '''';
  3453.     }
  3454.  
  3455.     for (var i = 0; i < fieldContent.length-1; i++) {
  3456.         if (fieldContent[i].match(/\w/)) {
  3457.             cleanContent.push(fieldContent[i]);
  3458.         }
  3459.     }
  3460.     
  3461.     var headers = doc.evaluate(''//form/table/tbody/tr/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);    
  3462.     
  3463.     //field title and cleancontent have the same number of entries; These are then associated and put into dataTags object.
  3464.     for (var i = 0; i < cleanContent.length; i++) {
  3465.         fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  3466.         if (fieldTitle.match(/\w/)) {
  3467.         
  3468.         } else {
  3469.             fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  3470.         }
  3471.         dataTags[fieldTitle] = cleanContent[i];
  3472.         
  3473.     }
  3474.     
  3475.     //The data is all now in the dataTags object. It needs only to be formatted and put in the proper Zotero fields.
  3476.     
  3477.     //fixing up any content that needs a different format for Zotero and then pushing it into Zotero.
  3478.     if (dataTags["Notes:"]) {
  3479.         if (dataTags["Notes:"].match("; ")) {
  3480.             var notes1 = dataTags["Notes:"].split("; ");
  3481.             var notes2 = '''';
  3482.         
  3483.             for (var i = 0; i < notes1.length; i++) {
  3484.                 
  3485.                 if (notes2.match(/\w/)) {
  3486.                     notes2 = notes2 + "; " + notes1[i];
  3487.                 } else {
  3488.                     notes2 = notes1[i];
  3489.                 }
  3490.             }
  3491.             dataTags["Notes:"] = notes2;
  3492.         } 
  3493.     }
  3494.     
  3495.     if (dataTags["Subjects:"]) {
  3496.         if (dataTags["Subjects:"].match("; ")) {
  3497.             tagsContent = dataTags["Subjects:"].split("; ");
  3498.         } else {
  3499.             newItem.tags = dataTags["Subjects:"];
  3500.             var noMoreTags = 1;
  3501.         }
  3502.         if (noMoreTags != 1) {
  3503.             for (var i = 0; i < tagsContent.length; i++) {
  3504.                 newItem.tags[i] = tagsContent[i];        
  3505.             }
  3506.         }
  3507.     }
  3508.     
  3509.     if (dataTags["Author:"]) {
  3510.         if (dataTags["Author:"].match(", ")) {
  3511.             var author = dataTags["Author:"].split('', '');
  3512.             author = author[1].substr(0, author[1].length) + " " + author[0];
  3513.             author = author.replace(/\./, '''');
  3514.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  3515.         }
  3516.     }
  3517.     
  3518.     if (dataTags["CorporateAuthor:"]) {
  3519.         newItem.creators.push({lastName: dataTags["CorporateAuthor:"], creatorType: "creator"});
  3520.     }
  3521.     
  3522.     if (dataTags["Location:"]) {
  3523.         newItem.extra = "Location in Library: " + " " + dataTags["Location:"];
  3524.     }
  3525.     
  3526.     if (dataTags["PersistentLinkforthisRecord:"]) {
  3527.         associateData (newItem, dataTags, "PersistentLinkforthisRecord:", "url");
  3528.     } else {
  3529.         newItem.url = doc.location.href;
  3530.     }
  3531.     
  3532.     //Publishing info is split in a best guess format. 
  3533.     //If not all of Place, Publisher and Date are present, or they are in an unstandard format, the information is stored in Publisher.
  3534.     if (dataTags["PublicationInformation:"]) {
  3535.         if (dataTags["PublicationInformation:"].match(": ")) {
  3536.             var colon = dataTags["PublicationInformation:"].indexOf(":");
  3537.             var place1 = dataTags["PublicationInformation:"].substr(0, colon);
  3538.             newItem.place = place1;
  3539.             var publisher1 = dataTags["PublicationInformation:"].substr(colon);
  3540.             if (publisher1.match(", ")) {
  3541.                 var date1 = publisher1.split(", ");
  3542.                 newItem.publisher = date1[0];
  3543.                 if (date1[1].match(/\d/)) {
  3544.                     newItem.date = date1[1];
  3545.                 }
  3546.             } else {
  3547.                 newItem.date = publisher1;
  3548.             }
  3549.         } else {
  3550.             newItem.publisher = dataTags["PublicationInformation:"];
  3551.         }
  3552.     }
  3553.     
  3554.     associateData (newItem, dataTags, "Title:", "title");    
  3555.     associateData (newItem, dataTags, "Series:", "series");    
  3556.     associateData (newItem, dataTags, "Description:", "description");    
  3557.     associateData (newItem, dataTags, "ISBN:", "ISBN");
  3558.     associateData (newItem, dataTags, "Notes:", "abstractNote");
  3559.     associateData (newItem, dataTags, "CallNumber:", "callNumber");
  3560.     associateData (newItem, dataTags, "Edition:", "edition");
  3561.  
  3562.     newItem.notes.push({title:"Title", note:"Site is designed to timeout user. This may prevent Zotero from saving a screen capture."});
  3563.  
  3564.     newItem.complete();
  3565. }
  3566.  
  3567. function doWeb(doc, url) {
  3568.     var namespace = doc.documentElement.namespaceURI;
  3569.     var nsResolver = namespace ? function(prefix) {
  3570.         if (prefix == ''x'') return namespace; else return null;
  3571.     } : null;
  3572.     
  3573.     var articles = new Array();
  3574.     
  3575.     if (detectWeb(doc, url) == "multiple") {
  3576.         var items = new Object();
  3577.         
  3578.         var typeOfPage = doc.evaluate(''//table/tbody/tr/th[3]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3579.         Zotero.debug(typeOfPage);
  3580.         
  3581.         if (typeOfPage.match("Title")) {
  3582.             var titles = doc.evaluate(''//table/tbody/tr/td[3]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3583.         } else {
  3584.             var titles = doc.evaluate(''//table[2]/tbody/tr/td[2]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3585.         }
  3586.         
  3587.         var next_title;
  3588.         while (next_title = titles.iterateNext()) {
  3589.             items[next_title.href] = next_title.textContent;
  3590.         }
  3591.         items = Zotero.selectItems(items);
  3592.         for (var i in items) {
  3593.             articles.push(i);
  3594.         }
  3595.     } else {
  3596.         articles = [url];
  3597.     }
  3598.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  3599.     Zotero.wait();
  3600. }');
  3601.  
  3602.  
  3603. REPLACE INTO translators VALUES ('330f283f-12e9-4421-aa59-e17ec5f4aa37', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'Glenbow Library', 'Adam Crymble', 'http://ww2.glenbow.org/', 
  3604. 'function detectWeb(doc, url) {
  3605.     
  3606.     if (doc.title.match("Library Main Catalogue Search Results") && doc.location.href.match("GET_RECORD")) {
  3607.             return "book";
  3608.     } else if 
  3609.         (doc.title.match("Library Map Collection Search Results") && doc.location.href.match("GET_RECORD")) {
  3610.             return "map";
  3611.             
  3612.     } else if 
  3613.         (doc.title.match("Library Main Catalogue Search Results") && !(doc.location.href.match("GET_RECORD"))) {
  3614.             return "multiple";
  3615.     } else if
  3616.         (doc.title.match("Map Collection Search Results") && !(doc.location.href.match("GET_RECORD"))) {
  3617.             return "multiple";
  3618.     }
  3619. }', 
  3620. '//Translator for the Glenbow Museum Collection. Code by Adam Crymble
  3621. //Only works for Library Main Catalogue and Map Collection. The other categories do not have stable URLs for individual entries.
  3622.  
  3623.  
  3624. function associateContent (newItem, dataTags, field, zoteroField) {
  3625.     if (dataTags[field]) {
  3626.         newItem[zoteroField] = dataTags[field];
  3627.     }
  3628. }
  3629.  
  3630. function scrape (doc, url) {
  3631.     var namespace = doc.documentElement.namespaceURI;
  3632.     var nsResolver = namespace ? function(prefix) {
  3633.     } : null;
  3634.     
  3635.     var fieldTitle = new Array();
  3636.     var tagsContent = new Array();
  3637.     
  3638.     if (detectWeb(doc, url) == "book") {
  3639.         
  3640.         newItem = new Zotero.Item("book");
  3641.         authorType= "author";
  3642.     
  3643.     } else if (detectWeb(doc, url) == "map") {
  3644.         
  3645.         newItem = new Zotero.Item("map");
  3646.         authorType= "cartographer";
  3647.     }
  3648.         
  3649.         var dataTags= new Object();
  3650.         var authorType;
  3651.         var organizeName;
  3652.         
  3653.     if (doc.evaluate(''//tr/td/p'', doc, nsResolver, XPathResult.ANY_TYPE, null)) {    
  3654.         var xPathContent = doc.evaluate(''//tr/td/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3655.         var xPathCount = doc.evaluate(''count (//tr/td/p)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3656.         
  3657.             for (var i = 0; i < xPathCount.numberValue; i++) {
  3658.             
  3659.                 fieldTitle= xPathContent.iterateNext().textContent;
  3660.             
  3661.                 var separate = fieldTitle.indexOf(":");
  3662.                 var fieldTitle1 = fieldTitle.substr(0, separate);            
  3663.                 fieldTitle1 = fieldTitle1.replace(/\s+/g, '''');
  3664.             
  3665.                 var fieldContent = fieldTitle.substr(separate + 2);
  3666.             
  3667.                 dataTags[fieldTitle1] = (fieldContent);
  3668.             
  3669.             }
  3670.         
  3671.         
  3672.         //names start
  3673.             if (dataTags["Names"]) {
  3674.                 
  3675.             //if there are multiple authors:
  3676.                 if (dataTags["Names"].match("\n")) {
  3677.                     var multipleNames = dataTags["Names"].split("\n");
  3678.     
  3679.                     for (j = 0; j < multipleNames.length; j++) {
  3680.                         if (detectWeb(doc, url) == "book") {
  3681.                             multipleNames[j] = multipleNames[j].substr(3);
  3682.                             
  3683.                         } else if (detectWeb(doc, url) == "map") {
  3684.                             multipleNames[j] = multipleNames[j];
  3685.                         }                                            
  3686.                                                 
  3687.                         if (multipleNames[j].match(/\,/)) {
  3688.                             
  3689.                             organizeName = multipleNames[j].split(",");
  3690.                             organizeName = (organizeName[1] + (" ") + organizeName[0]);        
  3691.                             newItem.creators.push(Zotero.Utilities.cleanAuthor(organizeName, authorType));
  3692.                             
  3693.                         } else {
  3694.                             newItem.creators.push({lastName: multipleNames[j], creatorType: authorType});
  3695.                         }
  3696.                         
  3697.                     }
  3698.                     
  3699.             //if there is 1 human author        
  3700.                 } else if (dataTags["Names"].match(/\,/)) {
  3701.                     if (detectWeb(doc, url) == "book") {
  3702.                         var organizeName = dataTags["Names"].substr(3).split(",");
  3703.                     
  3704.                     } else if (detectWeb(doc, url) == "map") {
  3705.                         var organizeName = dataTags["Names"].split(",");
  3706.                     }    
  3707.     
  3708.                     organizeName = (organizeName[1] + (" ") + organizeName[0]);
  3709.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(organizeName,authorType));            
  3710.                 
  3711.             //if there is 1 corporate author    
  3712.                 } else {
  3713.                     if (detectWeb(doc, url) == "book") {
  3714.                         newItem.creators.push({lastName: dataTags["Names"].substr(3), creatorType: authorType});
  3715.                     
  3716.                     } else if (detectWeb(doc, url) == "map") {
  3717.                         newItem.creators.push({lastName: dataTags["Names"], creatorType: authorType});
  3718.                         
  3719.                     }    
  3720.                 }
  3721.             }        
  3722.             
  3723.         //tags start    
  3724.             if (dataTags["Subjects"]) {
  3725.                 if (dataTags["Subjects"].match("\n")) {
  3726.                     var multipleSubjects= dataTags["Subjects"].split("\n");
  3727.     
  3728.                     for (j = 0; j < multipleSubjects.length; j++) {
  3729.                         multipleSubjects[j] = multipleSubjects[j].substr(3);
  3730.                         tagsContent.push(Zotero.Utilities.cleanTags(multipleSubjects[j]));
  3731.                     }
  3732.                 } else {
  3733.                     dataTags["Subjects"] = dataTags["Subjects"].substr(3);
  3734.                     tagsContent.push(Zotero.Utilities.cleanTags(dataTags["Subjects"]));
  3735.                 }
  3736.                 
  3737.                 for (var y = 0; y < tagsContent.length; y++) {
  3738.                     newItem.tags[y] = tagsContent[y];
  3739.                 }
  3740.             }        
  3741.             
  3742.         //book publisher info start
  3743.             if (dataTags["PublishingInformation"]) {
  3744.                     dataTags["PublishingInformation"] = dataTags["PublishingInformation"].replace(/\[|\]*/g, '''');
  3745.                 
  3746.                     var pubLoc= dataTags["PublishingInformation"].split(":");
  3747.                     if (pubLoc[1]) {
  3748.                         dataTags["Place"] = pubLoc[0];
  3749.                         
  3750.                         var pubAndDate = pubLoc[1].split(",");
  3751.                         dataTags["Publisher"] = pubAndDate[0];
  3752.                         dataTags["Date"] = pubAndDate[1];
  3753.                     } else { 
  3754.                         associateContent (newItem, dataTags, "PublishingInformation", "date");    
  3755.                     }                
  3756.             }
  3757.             
  3758.         //accession number start    
  3759.             if (dataTags["Accessionnumber"]) {
  3760.                     
  3761.                 dataTags["Accessionnumber"] = ("Accession number: " + dataTags["Accessionnumber"]);
  3762.             }
  3763.             
  3764.             if (dataTags["CallNumber"]) {
  3765.                 if (dataTags["CallNumber"] == '' '') {
  3766.                     dataTags["CallNumber"] = "None";
  3767.                     Zotero.debug(dataTags["CallNumber"]);
  3768.                 }
  3769.             }
  3770.         }        
  3771.             associateContent (newItem, dataTags, "CallNumber", "callNumber");
  3772.             associateContent (newItem, dataTags, "Title", "title");
  3773.             associateContent (newItem, dataTags, "Place", "place");
  3774.             associateContent (newItem, dataTags, "Publisher", "publisher");
  3775.             associateContent (newItem, dataTags, "Date", "date");
  3776.             associateContent (newItem, dataTags, "Description", "pages");
  3777.             associateContent (newItem, dataTags, "Edition", "edition");
  3778.             associateContent (newItem, dataTags, "Notes", "abstractNote");
  3779.             associateContent (newItem, dataTags, "Accessionnumber", "extra");
  3780.             associateContent (newItem, dataTags, "Scale", "scale");
  3781.             
  3782.             newItem.url = doc.location.href;    
  3783.             if (!newItem.title) newItem.title = "New Search Terms Suggested"    
  3784.             newItem.complete();
  3785. }
  3786.  
  3787. function doWeb(doc, url) {
  3788.     var namespace = doc.documentElement.namespaceURI;
  3789.     var nsResolver = namespace ? function(prefix) {
  3790.         if (prefix == ''x'') return namespace; else return null;
  3791.     } : null;
  3792.     
  3793.     var articles = new Array();
  3794.     var dataTags = new Object();
  3795.     var titleList = new Array();
  3796.     var uris = new Array();
  3797.     var next_title= new Array();
  3798.     
  3799.     if (detectWeb(doc, url) == "multiple") {
  3800.         
  3801.     //checks multiple entries for a link to a single entry page.
  3802.         if (doc.evaluate(''//td/div[@class="floatRight"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  3803.         
  3804.             var items = new Object();
  3805.             var titles = doc.evaluate(''//td/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3806.                 
  3807.             var xPathMultiCount = doc.evaluate(''count (//td/p)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3808.             
  3809.             
  3810.                 for (var i = 0; i < xPathMultiCount.numberValue; i++) {
  3811.                     
  3812.                     articles= titles.iterateNext().textContent;
  3813.                 
  3814.                     var separateMulti = articles.indexOf(":");
  3815.                     var articles1 = articles.substr(0, separateMulti);            
  3816.                     articles1 = articles1.replace(/\s+/g, '''');
  3817.                 
  3818.                     var multiContent = articles.substr(separateMulti + 2);
  3819.                 
  3820.                     dataTags[articles1] = (multiContent);
  3821.                     
  3822.                     if (articles1 == "Title") {
  3823.                         titleList.push(dataTags["Title"]);
  3824.                     }
  3825.                     if (articles1 == "See") {
  3826.                         titleList.push("skip");
  3827.                     }
  3828.                 }
  3829.             var links = doc.evaluate(''//td/div[@class="floatRight"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);    
  3830.             var xPathLinksCount = doc.evaluate(''count (//td/div[@class="floatRight"]/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3831.             
  3832.             for (i=0; i<xPathLinksCount.numberValue; i++) {
  3833.                 next_title.push(links.iterateNext().href);
  3834.                 if (titleList[i] != "skip") {
  3835.                     items[next_title] = titleList[i];
  3836.                 }
  3837.             }    
  3838.         
  3839.             items = Zotero.selectItems(items);
  3840.             
  3841.             for (var i in items) {
  3842.                 uris.push(i);
  3843.             }
  3844.         
  3845.         }
  3846.         
  3847. //code if single entry only.        
  3848.     } else { 
  3849.         uris = [url];
  3850.     }
  3851.     
  3852.     Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();});
  3853.     Zotero.wait();
  3854. }');
  3855.  
  3856.  
  3857. REPLACE INTO translators VALUES ('e0234bcf-bc56-4577-aa94-fe86a27f6fd6', '1.0.0b4.r5', '', '2008-08-04 07:10:00', '0', '100', '4', 'The Globe and Mail', 'Adam Crymble', 'http://www.theglobeandmail.com', 
  3858. 'function detectWeb(doc, url) {
  3859.     var namespace = doc.documentElement.namespaceURI;
  3860.     var nsResolver = namespace ? function(prefix) {
  3861.         if (prefix == ''x'') return namespace; else return null;
  3862.     } : null;
  3863.     
  3864.     var metaTags = new Object();
  3865.     var metaTagHTML = doc.getElementsByTagName("meta");
  3866.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  3867.         metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  3868.         
  3869.     }
  3870.         
  3871.     if (doc.evaluate(''//div[@id="header"]/h2/a/img'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {    
  3872.         var printEdition1 = doc.evaluate(''//div[@id="header"]/h2/a/img'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().src;
  3873.         if (printEdition1.match("printedition")) {
  3874.             return "newspaperArticle";
  3875.         }
  3876.     }
  3877.         
  3878.     if (doc.evaluate(''//p[@id="continueReading"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3879.         var payPerView = doc.evaluate(''//p[@id="continueReading"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3880.         if (payPerView == "purchase this article") {
  3881.             return "newspaperArticle";
  3882.         }
  3883.     }
  3884.     
  3885.     if (metaTags["article_id"]) {
  3886.         return "newspaperArticle";
  3887.         
  3888.     } else if (doc.title.match(''globeandmail.com: Search'')) {
  3889.         return "multiple";
  3890.     } 
  3891.     
  3892.     if (doc.evaluate(''//ul[@id="utility"]/li[@class="email"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3893.         var blogCheck = doc.evaluate(''//ul[@id="utility"]/li[@class="email"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3894.         var blogCheck1 = blogCheck.iterateNext().textContent;
  3895.         if (blogCheck1.match("blog")) { 
  3896.             if (doc.location.href.match("story")) {
  3897.             return "blogPost";
  3898.             }
  3899.         }
  3900.     }
  3901. }', 
  3902. '//Translator for the Globe and Mail newspaper: code by Adam Crymble 
  3903.  
  3904. function associateMeta (newItem, metaTags, field, zoteroField) {
  3905.     if (metaTags[field]) {
  3906.         newItem[zoteroField] = metaTags[field];
  3907.     }
  3908. }
  3909.  
  3910. function scrape(doc, url) {
  3911.     var namespace = doc.documentElement.namespaceURI;
  3912.     var nsResolver = namespace ? function(prefix) {
  3913.         if (prefix == ''x'') return namespace; else return null;
  3914.     } : null;
  3915.     
  3916.     if (detectWeb(doc, url) == "blogPost") {
  3917.         var newItem = new Zotero.Item("blogPost");
  3918.         
  3919.         var title = doc.evaluate(''//div[@id="headline"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3920.         newItem.title = title.iterateNext().textContent;
  3921.         
  3922.         var blogger = doc.evaluate(''//div[@id="author"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null); 
  3923.         var bloggerName = blogger.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  3924.         var bloggerName1 = bloggerName.split(",");
  3925.         newItem.creators.push(Zotero.Utilities.cleanAuthor(bloggerName1[0], "author"));
  3926.     }
  3927.     var noMetaType = 0;
  3928.     
  3929.     if (detectWeb(doc, url) == "newspaperArticle") {
  3930.         var newItem = new Zotero.Item("newspaperArticle");
  3931.         
  3932.     //checks if the article is from the "Print Edition" which doesn''t contain meta data.    
  3933.         if (doc.evaluate(''//div[@id="header"]/h2/a/img'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {    
  3934.             var printEdition1 = doc.evaluate(''//div[@id="header"]/h2/a/img'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().src;
  3935.             if (printEdition1.match("printedition")) {
  3936.                 noMetaType = 1;
  3937.                 if (doc.evaluate(''//div[@id="author"]/p[@class="article-date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3938.                     newItem.date= doc.evaluate(''//div[@id="author"]/p[@class="article-date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3939.                 }
  3940.             }
  3941.         }
  3942.         
  3943.     //checks if the article is a Pay per view article.    
  3944.         if (doc.evaluate(''//p[@id="continueReading"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3945.             var payPerView = doc.evaluate(''//p[@id="continueReading"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3946.             if (payPerView == "purchase this article") {
  3947.                 noMetaType = 1;
  3948.             }
  3949.         }
  3950.         
  3951.     //format for the "Print Edition" and "Pay per view" articles    
  3952.         if (noMetaType = 1) {
  3953.             noMetaType = 1;
  3954.                 if (doc.evaluate(''//div[@id="headline"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3955.                     newItem.title = doc.evaluate(''//div[@id="headline"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3956.                 }
  3957.                                 
  3958.                 if (doc.evaluate(''//div[@id="author"]/p[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3959.                     var author = doc.evaluate(''//div[@id="author"]/p[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3960.                 }
  3961.                 noMetaType = 0;
  3962.         }
  3963.         
  3964.         var metaTags = new Object();
  3965.         var tagsContent = new Array();
  3966.         
  3967.     //get data
  3968.         var metaTagHTML = doc.getElementsByTagName("meta");
  3969.         for (var i = 0 ; i < metaTagHTML.length ; i++) {
  3970.             metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  3971.         }
  3972.         
  3973.     //author    
  3974.         if (metaTags["byline"]) {
  3975.             var author = metaTags["byline"];
  3976.         }
  3977.         
  3978.     //date    
  3979.         if (metaTags["pubdate"]) {
  3980.             var month = metaTags["pubdate"].substr(4, 2);
  3981.             var day = metaTags["pubdate"].substr(6, 2);
  3982.             var year = metaTags["pubdate"].substr(0, 4);
  3983.             
  3984.             newItem.date = (year + "-" + month + "-"+ day);
  3985.         }
  3986.     
  3987.     //tags    
  3988.         if (metaTags["article_keywords"]) {
  3989.             tagsContent = metaTags["article_keywords"].split("; ");
  3990.         }
  3991.         
  3992.         for (var i = 0; i < tagsContent.length; i++) {
  3993.                  if (tagsContent[i] != (" ") && tagsContent[i] != ("")) {
  3994.                      newItem.tags[i] = tagsContent[i];
  3995.                  }
  3996.              }    
  3997.         
  3998.         associateMeta (newItem, metaTags, "headline", "title");
  3999.         associateMeta (newItem, metaTags, "summary", "abstractNote");
  4000.         associateMeta (newItem, metaTags, "desk", "section");    
  4001.         associateMeta (newItem, metaTags, "article_id", "callNumber");
  4002.         associateMeta (newItem, metaTags, "credit", "rights");
  4003.     
  4004.     //rest of author (shared between both newspaperArticle types)
  4005.         if (author) {
  4006.             
  4007.         
  4008.             if (author.substr(0,3).toLowerCase() == "by ") {
  4009.                 author= author.substr(3);
  4010.             }
  4011.         
  4012.             var authors = author.toLowerCase().split(" and ");
  4013.             for each(var author in authors) {
  4014.                 var words = author.split(" ");
  4015.                 
  4016.                 for (var i in words) {
  4017.                     if (words[i] != "") {
  4018.                         words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  4019.                     }
  4020.                 }
  4021.                 author = words.join(" ");
  4022.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));            
  4023.             }
  4024.         }
  4025.     }    
  4026.     
  4027.     newItem.url = doc.location.href;
  4028.     newItem.complete();
  4029.     
  4030. }
  4031.  
  4032. function doWeb(doc, url) {
  4033.     var namespace = doc.documentElement.namespaceURI;
  4034.     var nsResolver = namespace ? function(prefix) {
  4035.         if (prefix == ''x'') return namespace; else return null;
  4036.     } : null;
  4037.     
  4038.     var articles = new Array();
  4039.     
  4040.     if (detectWeb(doc, url) == "multiple") {
  4041.         var items = new Object();
  4042.         var next_title = new Array();
  4043.         
  4044.         var titlesCount = doc.evaluate(''count (//h3[@class="storyLink"]/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4045.         var titles = doc.evaluate(''//h3[@class="storyLink"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);        
  4046.         
  4047.         for (i=0; i < titlesCount.numberValue; i++) {
  4048.             next_title = titles.iterateNext();
  4049.             
  4050.             if (next_title.href.match("story")) {
  4051.                 items[next_title.href] = next_title.textContent;
  4052.             }
  4053.         }    
  4054.         
  4055.         items = Zotero.selectItems(items);
  4056.         for (var i in items) {
  4057.             articles.push(i);
  4058.         }
  4059.     } else {
  4060.         articles = [url];
  4061.     }
  4062.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4063.     Zotero.wait();
  4064. }');
  4065.  
  4066.  
  4067. REPLACE INTO translators VALUES ('d71e9b6d-2baa-44ed-acb4-13fe2fe592c0', '1.0.0b4.r5', '', '2008-08-04 07:10:00', '0', '100', '4', 'Google Patents', 'Adam Crymble', 'http://www\.google.*/patents', 
  4068. 'function detectWeb(doc, url) {
  4069.     
  4070.     if (doc.location.href.match("Search")) {
  4071.         return "multiple";
  4072.     } else if (doc.location.href.match("id")) {
  4073.         return "patent";
  4074.     }
  4075.     
  4076. }', 
  4077. '//Google Patents Translator. Code by Adam Crymble
  4078.  
  4079. function associateData (newItem, dataTags, field, zoteroField) {
  4080.     if (dataTags[field]) {
  4081.         newItem[zoteroField] = dataTags[field];
  4082.     }
  4083. }
  4084.  
  4085. function scrape(doc, url) {
  4086.     var namespace = doc.documentElement.namespaceURI;
  4087.     var nsResolver = namespace ? function(prefix) {
  4088.         if (prefix == ''x'') return namespace; else return null;
  4089.     } : null;    
  4090.     
  4091.     var dataTags = new Object();
  4092.     var headings = new Array();
  4093.     var newItem = new Zotero.Item("patent");
  4094.  
  4095.  //checks format type
  4096.     if (doc.location.href.match("printsec")) {
  4097.         
  4098.         var contents = doc.evaluate(''//table[@id="summarytable"]/tbody/tr[1]/td'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4099.         var xPathHeadings = doc.evaluate(''//b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4100.         
  4101.         var xPathCount = doc.evaluate(''count (//b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4102.         
  4103.         if (doc.evaluate(''//span[@class="addmd"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4104.             
  4105.             var author = doc.evaluate(''//span[@class="addmd"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4106.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "inventor"));
  4107.         }
  4108.     
  4109.     } else {
  4110.     
  4111.         var xPathHeadings = doc.evaluate(''//div[@class="patent_bibdata"]/p/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4112.     
  4113.         var xPathCount = doc.evaluate(''count (//div[@class="patent_bibdata"]/p/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4114.     
  4115.     
  4116.         var xPathContents = doc.evaluate(''//div[@class="patent_bibdata"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4117.         var contentsCount = doc.evaluate(''count (//div[@class="patent_bibdata"]/p)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4118.         
  4119.         var contents;
  4120.         for (i = 0; i < contentsCount.numberValue; i++) {
  4121.             contents = (contents + xPathContents.iterateNext().textContent + " ");
  4122.         }
  4123.         
  4124.         if (doc.evaluate(''//td[3]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4125.             newItem.abstractNote = (doc.evaluate(''//td[3]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Abstract", ''''));
  4126.         }    
  4127.     
  4128.     }
  4129.     
  4130.     for (var i =0; i < xPathCount.numberValue; i++) {
  4131.         
  4132.         headings.push(xPathHeadings.iterateNext().textContent);    
  4133.         contents = contents.replace(headings[i], "xxx");    
  4134.     }
  4135.     
  4136.     
  4137.     var splitContent = new Array();
  4138.     splitContent = contents.split(/xxx/);
  4139.  
  4140.  //associate headings with contents.
  4141.     for (var i = 0; i < headings.length; i++) {
  4142.         fieldTitle = headings[i].replace(/\s+|\W*/g, '''');
  4143.         
  4144.         if (fieldTitle == "USClassification" | fieldTitle == "InternationalClassification" | fieldTitle == "Abstract") {
  4145.             dataTags[fieldTitle] = splitContent[i+1];
  4146.         } else {
  4147.             dataTags[fieldTitle] = splitContent[i+1].replace(": ", '''');
  4148.         }
  4149.     
  4150.         if (dataTags[fieldTitle].match("About this patent")) {
  4151.             dataTags[fieldTitle] = dataTags[fieldTitle].replace("About this patent", '''');
  4152.         }
  4153.         
  4154.     //author(s)
  4155.         if (fieldTitle == "Inventors") {
  4156.             var authors = dataTags[fieldTitle].split(", ");
  4157.             for (var j = 0; j < authors.length; j++) {
  4158.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "inventor"));
  4159.             }
  4160.         } else if (fieldTitle == "Inventor") {
  4161.             newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventor"], "inventor"));
  4162.         }
  4163.     }
  4164.  
  4165.  //extra field
  4166.     if (dataTags["USClassification"] && dataTags["InternationalClassification"]) {
  4167.         Zotero.debug(doc.title);
  4168.         newItem.extra = ("U.S. Classification: " + dataTags["USClassification"] + "; International Classification: " + dataTags["InternationalClassification"]);
  4169.     } else if (dataTags["USClassification"] ) {
  4170.         newItem.extra = ("U.S. Classification: " + dataTags["USClassification"]);
  4171.     } else if (dataTags["InternationalClassification"]) {
  4172.         newItem.extra = ("International Classification: " + dataTags["InternationalClassification"]);
  4173.     }
  4174.  
  4175.     associateData (newItem, dataTags, "Patentnumber", "patentNumber");
  4176.     associateData (newItem, dataTags, "Issuedate", "date");
  4177.     associateData (newItem, dataTags, "Assignees", "assignee");
  4178.     associateData (newItem, dataTags, "Assignee", "assignee");
  4179.     associateData (newItem, dataTags, "Abstract", "abstractNote");
  4180.     associateData (newItem, dataTags, "Applicationnumber", "applicationNumber");
  4181.     
  4182.     newItem.title = doc.evaluate(''//h2[@class="title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4183.     newItem.url = doc.location.href;
  4184.  
  4185.     newItem.complete();
  4186. }
  4187.  
  4188. function doWeb(doc, url) {
  4189.     var namespace = doc.documentElement.namespaceURI;
  4190.     var nsResolver = namespace ? function(prefix) {
  4191.         if (prefix == ''x'') return namespace; else return null;
  4192.     } : null;
  4193.     
  4194.     var articles = new Array();
  4195.     
  4196.     if (detectWeb(doc, url) == "multiple") {
  4197.         var items = new Object();
  4198.         
  4199.         var xPathFirstTitle = doc.evaluate(''//div[@id="results_container"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4200.         var firstTitle = xPathFirstTitle.iterateNext();
  4201.         
  4202.         var titles = doc.evaluate(''//p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4203.         
  4204.         items[firstTitle.href] = firstTitle.textContent;
  4205.         
  4206.         var next_title;
  4207.         while (next_title = titles.iterateNext()) {
  4208.             if (next_title.textContent.match("RSS feed")) {
  4209.                 
  4210.             } else {
  4211.                 items[next_title.href] = next_title.textContent;
  4212.             }
  4213.         }
  4214.         items = Zotero.selectItems(items);
  4215.         for (var i in items) {
  4216.             articles.push(i);
  4217.         }
  4218.     } else {
  4219.         articles = [url];
  4220.     }
  4221.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4222.     Zotero.wait();
  4223. }
  4224. ');
  4225.  
  4226.  
  4227. REPLACE INTO translators VALUES ('c41c9c66-8540-4216-b138-7c00532748c9', '1.0.0b4.r5', '', '2008-08-04 07:10:00', '0', '100', '4', 'Gulag: Many Days, Many Lives', 'Adam Crymble', 'http://gulaghistory.org', 
  4228. 'function detectWeb(doc, url) {
  4229.     if (doc.evaluate(''//div[@class="field"][@id="citation"]/p'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4230.         return "book";
  4231.     } else if (doc.evaluate(''//h3/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4232.         return "multiple";
  4233.     }    
  4234. }', 
  4235. '//Gulag: Many Days, Many  Lives translator; Code by Adam Crymble
  4236.  
  4237. function scrape(doc, url) {
  4238.  
  4239.     var namespace = doc.documentElement.namespaceURI;
  4240.     var nsResolver = namespace ? function(prefix) {
  4241.         if (prefix == ''x'') return namespace; else return null;
  4242.     } : null;    
  4243.     
  4244.     var newItem = new Zotero.Item("book");
  4245.     
  4246.     if (doc.evaluate(''//div[@class="field"][@id="description"]/div'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4247.         var abstract1 = doc.evaluate(''//div[@class="field"][@id="description"]/div'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4248.         newItem.abstractNote = abstract1.replace(/^\s+|\s*$/g, '''');
  4249.     }
  4250.     
  4251.     if (doc.evaluate(''//div[@class="field"][@id="source"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4252.         var rights1 = doc.evaluate(''//div[@class="field"][@id="source"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4253.         newItem.rights = rights1.replace(/^\s+|\s*$/g, '''');
  4254.     }
  4255.     
  4256.     var cite = doc.evaluate(''//div[@class="field"][@id="citation"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4257.     
  4258.     var checkForAuthor = cite.indexOf(''"'');
  4259.     
  4260.     if (cite.match("Gulag: Many Days, Many Lives")) {
  4261.  
  4262.         var split1 = new Array();
  4263.         var split2 = new Array();
  4264.         var split3 = new Array();
  4265.         var split4 = new Array();
  4266.         var split5 = new Array();
  4267.     
  4268.         if (checkForAuthor == 0) {
  4269.             split1[1] = cite;
  4270.         } else {
  4271.                //author
  4272.             split1 = cite.split('', "'');
  4273.             var authorWords = split1[0].split(/\b\s/);
  4274.             if (authorWords.length > 3) {
  4275.                 newItem.creators.push({lastName: split1[0], creatorType: "creator"});
  4276.             } else {
  4277.             
  4278.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(split1[0], "author"));
  4279.             }
  4280.         }
  4281.         
  4282.         //title    
  4283.         split2 = split1[1].split(''." '');
  4284.         newItem.title = split2[0];    
  4285.        
  4286.            //repository
  4287.         split3 = split2[1].split("Lives, ");    
  4288.         
  4289.            //object number    
  4290.         split4 = split3[1].split(" (");
  4291.         newItem.callNumber = split4[0];
  4292.         
  4293.            //date posted and URL
  4294.         split5 = split4[1].split(")<");
  4295.         newItem.date = split5[0];
  4296.  
  4297.     } else {
  4298.  
  4299.         var split1 = cite.split(". ");
  4300.         Zotero.debug(split1);
  4301.  
  4302.         //author
  4303.         var author = split1[0].split(/\, /);
  4304.         author = author[1] + '' '' + author[0];
  4305.         Zotero.debug(author);
  4306.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  4307.  
  4308.         //title
  4309.         newItem.title = split1[1];
  4310.         
  4311.         //place
  4312.         var place1 = split1[2].split(":");
  4313.         newItem.place = place1[0];
  4314.         
  4315.         //date
  4316.         var date1 = split1[2].split (", ");
  4317.         newItem.date = date1[1];
  4318.         
  4319.         //publisher
  4320.         newItem.publisher = date1[0].replace(place1[0], '''').substr(2);
  4321.     }
  4322.     
  4323.     newItem.url = doc.location.href;
  4324.     newItem.complete();
  4325. }
  4326.  
  4327. function doWeb(doc, url) {
  4328.     var namespace = doc.documentElement.namespaceURI;
  4329.     var nsResolver = namespace ? function(prefix) {
  4330.         if (prefix == ''x'') return namespace; else return null;
  4331.     } : null;
  4332.     
  4333.     var articles = new Array();
  4334.     
  4335.     if (detectWeb(doc, url) == "multiple") {
  4336.         var items = new Object();
  4337.         
  4338.         var titles = doc.evaluate(''//h3/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4339.         
  4340.         var next_title;
  4341.         
  4342.         while (next_title = titles.iterateNext()) {
  4343.             
  4344.             items[next_title.href] = next_title.textContent;
  4345.         }
  4346.         items = Zotero.selectItems(items);
  4347.         for (var i in items) {
  4348.             articles.push(i);
  4349.         }
  4350.     } else {
  4351.         articles = [url];
  4352.     }
  4353.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4354.     Zotero.wait();
  4355. }');
  4356.  
  4357.  
  4358. REPLACE INTO translators VALUES ('c9338ed5-b512-4967-8ffe-ab9c973559ef', '1.0.0b4.r5', '', '2008-08-04 07:10:00', '0', '100', '4', 'The Hamilton Spectator', 'Adam Crymble', 'http://www.thespec.com', 
  4359. 'function detectWeb(doc, url) {
  4360.     if (doc.location.href.match("search")) {
  4361.         return "multiple";
  4362.     } else if (doc.location.href.match("article")) {
  4363.         return "newspaperArticle";
  4364.     }
  4365. }', 
  4366. '//Hamilton Spectator translator. code by Adam Crymble
  4367.  
  4368. function scrape(doc, url) {
  4369.  
  4370.     var namespace = doc.documentElement.namespaceURI;
  4371.     var nsResolver = namespace ? function(prefix) {
  4372.         if (prefix == ''x'') return namespace; else return null;
  4373.     } : null;    
  4374.     
  4375.     var newItem = new Zotero.Item("newspaperArticle");
  4376.  
  4377.     if (doc.title.match("TheSpec.com - ")) {
  4378.         var lineBreak = doc.title.lastIndexOf(" - ");
  4379.         newItem.section = doc.title.substr(14, lineBreak-14);
  4380.     }
  4381.  
  4382.     var xPathAbstract = ''//span[@class="subhead1"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___SubTitle1__"]'';
  4383.     if (doc.evaluate(xPathAbstract, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4384.         newItem.abstractNote = doc.evaluate(xPathAbstract, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4385.     }
  4386.     
  4387.     var xPathAuthor1 = ''//span[@class="articleAuthor"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Author1__"]'';
  4388.     if (doc.evaluate(xPathAuthor1, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4389.         var author1 = doc.evaluate(xPathAuthor1, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4390.         if (author1.match(", ")) {
  4391.             author1 = author1.split(", ");
  4392.             author1 = author1[0];
  4393.         }
  4394.         var words = author1.toLowerCase().split(/\s/);
  4395.                 
  4396.         for (var i in words) {
  4397.             words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  4398.         }
  4399.                 
  4400.         author1 = words.join(" ");
  4401.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author1, "author"));    
  4402.     }
  4403.     
  4404.     var xPathAuthor2 = ''//span[@class="articleAuthor"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Author2__"]'';
  4405.     if (doc.evaluate(xPathAuthor2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4406.         var author2 = doc.evaluate(xPathAuthor2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4407.         if (author2.match(", ")) {
  4408.             author2 = author2.split(", ");
  4409.             author2 = author2[0];
  4410.         }
  4411.         var words = author2.toLowerCase().split(/\s/);
  4412.                 
  4413.         for (var i in words) {
  4414.             words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  4415.         }
  4416.                 
  4417.         author2 = words.join(" ");
  4418.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author2, "author"));    
  4419.     }
  4420.     
  4421.     var xPathTitle = ''//span[@class="headlineArticle"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Title__"]'';
  4422.     newItem.title = doc.evaluate(xPathTitle, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;    
  4423.     
  4424.     newItem.url = doc.location.href;
  4425.     newItem.publicationTitle = "The Hamilton Spectator";
  4426.  
  4427.     newItem.complete();
  4428. }
  4429.  
  4430. function doWeb(doc, url) {
  4431.     var namespace = doc.documentElement.namespaceURI;
  4432.     var nsResolver = namespace ? function(prefix) {
  4433.         if (prefix == ''x'') return namespace; else return null;
  4434.     } : null;
  4435.     
  4436.     var articles = new Array();
  4437.     
  4438.     if (detectWeb(doc, url) == "multiple") {
  4439.         var items = new Object();
  4440.         
  4441.         var titles = doc.evaluate(''//a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4442.         
  4443.         var next_title;
  4444.         while (next_title = titles.iterateNext()) {
  4445.             if (next_title.href.match("article") && !next_title.href.match("229246") && !next_title.textContent.match(/\s\s\s/)) {
  4446.                 items[next_title.href] = next_title.textContent;
  4447.             }
  4448.         }
  4449.         items = Zotero.selectItems(items);
  4450.         for (var i in items) {
  4451.             articles.push(i);
  4452.         }
  4453.     } else {
  4454.         articles = [url];
  4455.     }
  4456.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4457.     Zotero.wait();
  4458. }');
  4459.  
  4460.  
  4461. REPLACE INTO translators VALUES ('9418dcc2-cc1e-432b-b7a6-7b00b7402d2f', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'Hurricane Digital Memory Bank', 'Adam Crymble', 'http://hurricanearchive.org', 
  4462. 'function detectWeb(doc, url) {
  4463.     
  4464.     if (doc.evaluate(''//p[@id="cite-as"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4465.         return "book";
  4466.     } else if (doc.evaluate(''//p[@class="object_description"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  4467.         return "multiple";
  4468.     }
  4469. }', 
  4470. '//Hurricane Digital Memory Bank translator; Code by Adam Crymble
  4471.  
  4472. function scrape(doc, url) {
  4473.  
  4474.     var namespace = doc.documentElement.namespaceURI;
  4475.     var nsResolver = namespace ? function(prefix) {
  4476.         if (prefix == ''x'') return namespace; else return null;
  4477.     } : null;    
  4478.     
  4479.     var newItem = new Zotero.Item("book");
  4480.     
  4481.     var dataTags = new Object();
  4482.     var tagsContent = new Array();
  4483.     var tags;
  4484.     var cite = doc.evaluate(''//p[@id="cite-as"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4485.     var split1 = new Array();
  4486.     var split2 = new Array();
  4487.     var split3 = new Array();
  4488.     var split4 = new Array();
  4489.     var split5 = new Array();
  4490.  
  4491.        //author
  4492.     split1 = cite.split('', "'');
  4493.     var authorWords = split1[0].split(/\b\s/);
  4494.     if (authorWords.length > 3) {
  4495.         newItem.creators.push({lastName: split1[0], creatorType: "creator"});
  4496.     } else {
  4497.     
  4498.         newItem.creators.push(Zotero.Utilities.cleanAuthor(split1[0], "author"));
  4499.     }
  4500.     
  4501.     //title    
  4502.     split2 = split1[1].split(''." '');
  4503.     newItem.title = split2[0];    
  4504.    
  4505.        //repository
  4506.     split3 = split2[1].split("Bank, ");    
  4507.     
  4508.        //object number    
  4509.     split4 = split3[1].split(" (");
  4510.     newItem.callNumber = split4[0];
  4511.     
  4512.        //date posted and URL
  4513.     split5 = split4[1].split(")<");
  4514.     newItem.date = split5[0];
  4515.     
  4516.     //tags
  4517.     if (doc.evaluate(''//ul[@class="taglist"][@id="tags"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4518.         var xPathTags = doc.evaluate(''//ul[@class="taglist"][@id="tags"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4519.         var tagsCount = doc.evaluate(''count (//ul[@class="taglist"][@id="tags"]/li)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4520.         
  4521.         for (var i =0; i < tagsCount.numberValue; i++) {
  4522.             newItem.tags[i] = xPathTags.iterateNext().textContent;
  4523.         }
  4524.     }
  4525.     
  4526.     newItem.url = doc.location.href;
  4527.  
  4528.     newItem.complete();
  4529. }
  4530.  
  4531. function doWeb(doc, url) {
  4532.     var namespace = doc.documentElement.namespaceURI;
  4533.     var nsResolver = namespace ? function(prefix) {
  4534.         if (prefix == ''x'') return namespace; else return null;
  4535.     } : null;
  4536.     
  4537.     var articles = new Array();
  4538.     
  4539.     if (detectWeb(doc, url) == "multiple") {
  4540.         var items = new Object();
  4541.         
  4542.         
  4543.         var links = doc.evaluate(''//p[@class="object_description"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4544.         var titles = doc.evaluate(''//p[@class="object_description"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4545.         
  4546.         var next_title;
  4547.         
  4548.         while (next_title = titles.iterateNext()) {
  4549.             
  4550.             items[links.iterateNext().href] = next_title.textContent;
  4551.         }
  4552.         items = Zotero.selectItems(items);
  4553.         for (var i in items) {
  4554.             articles.push(i);
  4555.         }
  4556.     } else {
  4557.         articles = [url];
  4558.     }
  4559.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4560.     Zotero.wait();
  4561. }');
  4562.  
  4563.  
  4564. REPLACE INTO translators VALUES ('add79dfd-7951-4c72-af1d-ce1d50aa4fb4', '1.0.0b4.r5', '', '2008-06-30 17:43:00', '0', '100', '4', 'informIT database', 'Adam Crymble', 'http://www.informit.com', 
  4565. 'function detectWeb(doc,  url) {
  4566.     if (doc.title.match("Search Results")) {
  4567.         return "multiple";
  4568.     } else if (doc.location.href.match("topics")) {
  4569.         return "multiple";
  4570.         
  4571.     } else if (doc.location.href.match("product")) {
  4572.         return "book";
  4573.     } else if (doc.location.href.match("guides")) {
  4574.         return "book";
  4575.         
  4576.     } else if (doc.location.href.match("library")) {
  4577.         return "bookSection";
  4578.     } else if (doc.location.href.match(/articles\/article/)) {
  4579.         return "bookSection";
  4580.     }
  4581. }', 
  4582. '//informIT database translator. Code by Adam Crymble
  4583.  
  4584. function scrape(doc, url) {
  4585.  
  4586.     var namespace = doc.documentElement.namespaceURI;
  4587.     var nsResolver = namespace ? function(prefix) {
  4588.         if (prefix == ''x'') return namespace; else return null;
  4589.     } : null;    
  4590.     
  4591.     var dataTags = new Object();
  4592.     
  4593.     //FOR GUIDES
  4594.         if (doc.location.href.match("guides")) {
  4595.             var newItem = new Zotero.Item("book");
  4596.             newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4597.             
  4598.             var authors = doc.evaluate(''//div[@class="titling"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4599.         }
  4600.     
  4601.     //FOR ARTICLES
  4602.         if (doc.location.href.match(/articles\/article/)) {
  4603.             var newItem = new Zotero.Item("bookSection");
  4604.             
  4605.             var contents = doc.evaluate(''//div[@id="articleHeader"]/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4606.             var xPathCount = doc.evaluate(''count (//div[@id="articleHeader"]/ul/li)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4607.             
  4608.             var authors = contents.iterateNext().textContent.substr(3);
  4609.                         
  4610.             if (doc.evaluate(''//div[@class="relatedBook"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4611.                 newItem.bookTitle = doc.evaluate(''//div[@class="relatedBook"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4612.             }
  4613.                 
  4614.             newItem.date = contents.iterateNext().textContent;
  4615.             
  4616.             var rights1;
  4617.             if (xPathCount.numberValue> 2) {
  4618.                 newItem.rights = contents.iterateNext().textContent;
  4619.             }
  4620.             
  4621.             newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4622.         
  4623.         } else if (doc.evaluate(''//ul[@class="bibliography"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4624.  
  4625.  
  4626.     //FOR STORE BOOKS
  4627.         var newItem = new Zotero.Item("book");
  4628.         
  4629.         var contents = doc.evaluate(''//ul[@class="bibliography"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4630.         var xPathCount = doc.evaluate(''count (//ul[@class="bibliography"]/li)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4631.     
  4632.         for (i=0; i<xPathCount.numberValue; i++) {         
  4633.                  dataTags[i] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  4634.              }
  4635.     
  4636.         var authors = dataTags[0].substr(3);            
  4637.     
  4638.         if (dataTags[1].match("Published")) {
  4639.             var publisherInfo = dataTags[1].substr(10);
  4640.             var date = publisherInfo.substr(0, 12);
  4641.             newItem.date = date;
  4642.             
  4643.             if (publisherInfo.match("by ")) {
  4644.                 var publishCo = publisherInfo.split("by ");
  4645.                 newItem.publisher = publishCo[1];
  4646.             }
  4647.         }
  4648.         var extraStuff = dataTags[2].split(/\n/);
  4649.         
  4650.         var pageCut = extraStuff[0].indexOf("Pages");
  4651.         var dimensions = extraStuff[0].substr(0, pageCut).split("Dimensions ");
  4652.         
  4653.         newItem.description = "Dimensions: " + dimensions[1];
  4654.         newItem.pages = extraStuff[0].substr(pageCut+6);
  4655.         newItem.edition = extraStuff[1].replace(/Edition\:\s| \s\s*/g, '''');
  4656.         newItem.ISBN = extraStuff[2].substr(31, 18);
  4657.         newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4658.         
  4659.         
  4660.        //FOR LIBRARY BOOKS    
  4661.         } else if (doc.location.href.match("library")) {
  4662.             
  4663.             var newItem = new Zotero.Item("bookSection");
  4664.             
  4665.             newItem.title = doc.evaluate(''//h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4666.             var meta = doc.evaluate(''//div[@id="columnOne"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4667.             newItem.bookTitle = meta.iterateNext().textContent;
  4668.             
  4669.             var authors = meta.iterateNext().textContent.substr(3);
  4670.         }
  4671.  
  4672.      //SHARED    
  4673.         var noMoreAuthor = 0;
  4674.         
  4675.         if (authors.match(" and ")) {
  4676.             authors = authors.split(" and ");
  4677.         } else if (authors.match(", ")) {
  4678.             authors = authors.split(", ");
  4679.         } else {
  4680.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author"));
  4681.             noMoreAuthor = 1;
  4682.         }
  4683.         
  4684.         if (authors.length>0 && noMoreAuthor != 1) {
  4685.             
  4686.             for (var i = 0; i < authors.length; i++) {
  4687.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  4688.             }
  4689.         }
  4690.     
  4691.     newItem.url = doc.location.href;
  4692.     newItem.complete();
  4693. }
  4694.  
  4695. function doWeb(doc, url) {
  4696.     var namespace = doc.documentElement.namespaceURI;
  4697.     var nsResolver = namespace ? function(prefix) {
  4698.         if (prefix == ''x'') return namespace; else return null;
  4699.     } : null;
  4700.     
  4701.     var articles = new Array();
  4702.     
  4703.     if (detectWeb(doc, url) == "multiple") {
  4704.         var items = new Object();
  4705.         var next_title;
  4706.         
  4707.        //xPath for Topics pages, else xPaths for regular search pages.
  4708.         if (doc.location.href.match("topics")) {
  4709.             var titles = doc.evaluate(''//div[@class="productList articles"]/dl/dt/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4710.         } else {
  4711.             var titles = doc.evaluate(''//td[3][@class="results"]/ul/li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4712.             var chapters = doc.evaluate(''//dt/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4713.         }
  4714.         
  4715.         while (next_title = titles.iterateNext()) {
  4716.             items[next_title.href] = next_title.textContent;
  4717.         }
  4718.         
  4719.         if (doc.title.match("Search Results")) {
  4720.             while (next_title = chapters.iterateNext()) {
  4721.                 items[next_title.href] = next_title.textContent;
  4722.             }
  4723.         }
  4724.         
  4725.         items = Zotero.selectItems(items);
  4726.         for (var i in items) {
  4727.             articles.push(i);
  4728.         }
  4729.     } else {
  4730.         articles = [url];
  4731.     }
  4732.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4733.     Zotero.wait();
  4734. }');
  4735.  
  4736.  
  4737. REPLACE INTO translators VALUES ('db0f4858-10fa-4f76-976c-2592c95f029c', '1.0.0b4.r5', '', '2008-07-24 05:30:00', '0', '100', '4', 'Internet Archive', 'Adam Crymble', 'http://www.archive.org', 
  4738. 'function detectWeb(doc, url) {
  4739.     var mediaType = "1";
  4740.         
  4741.     if (doc.evaluate(''//h3'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4742.         mediaType  = doc.evaluate(''//h3'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4743.         
  4744.     } else if (doc.evaluate(''//div[@class="box"][@id="spotlight"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4745.         mediaType  = doc.evaluate(''//div[@class="box"][@id="spotlight"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4746.         
  4747.     }else if (doc.evaluate(''//div[@class="box"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4748.         mediaType  = doc.evaluate(''//div[@class="box"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4749.     }
  4750.     
  4751.     if (mediaType == "The Item") {
  4752.         return "artwork";
  4753.     } else if ( mediaType.match("Spotlight")) {
  4754.         return "book";
  4755.     }else if (mediaType.match("book")) {
  4756.         return "book";
  4757.     } else if (mediaType.match("movie")) {
  4758.         return "videoRecording";
  4759.     } else if (mediaType.match("audio")) {
  4760.         return "audioRecording";
  4761.     } else     if (doc.location.href.match("search") && mediaType == "1") {
  4762.         return "multiple"; 
  4763.     }    
  4764. }', 
  4765. '//Internet Archive Translator. Code by Adam Crymble
  4766.  
  4767. function associateData (newItem, dataTags, field, zoteroField) {
  4768.     if (dataTags[field]) {
  4769.         newItem[zoteroField] = dataTags[field];
  4770.     }
  4771. }
  4772.  
  4773. function scrape(doc, url) {
  4774.  
  4775.     var namespace = doc.documentElement.namespaceURI;
  4776.     var nsResolver = namespace ? function(prefix) {
  4777.         if (prefix == ''x'') return namespace; else return null;
  4778.     } : null;    
  4779.     
  4780.     var dataTags = new Object();
  4781.     
  4782.     var tagsContent = new Array();
  4783.     var fieldContents = new Array();
  4784.     var fieldTitleLength;
  4785.     
  4786.     var fieldTitle;
  4787.     var scrapeType = 0;
  4788.     
  4789.     var mediaType1 = detectWeb(doc, url);
  4790.     
  4791.     if (mediaType1 == "artwork") {
  4792.         
  4793.         var newItem = new Zotero.Item("artwork");
  4794.         
  4795.         //split contents by linebreak and push into an array if it is not empty
  4796.         var contents = doc.evaluate(''//div[@id="col2"]/div[@class="box"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/);
  4797.         for (var i = 0; i < contents.length; i++) {
  4798.             if (contents[i].match(/\w/)) {
  4799.                 fieldContents.push(contents[i]);
  4800.             }  
  4801.         }
  4802.         var headers = doc.evaluate(''//div[@id="col2"]/div[@class="box"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4803.         var headersCount = doc.evaluate(''count (//div[@id="col2"]/div[@class="box"]/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4804.         
  4805.         for (var k = 0; k < headersCount.numberValue; k++) {
  4806.             fieldTitle = headers.iterateNext().textContent.toLowerCase();
  4807.             fieldTitleLength = fieldTitle.length;
  4808.             var fieldTitleSpot;
  4809.             
  4810.             for (var j = 0; j < fieldContents.length; j++) {
  4811.                 if (fieldContents[j].match(fieldTitle)) {
  4812.                     fieldTitleSpot = fieldContents[j].indexOf(fieldTitle);
  4813.                     if (fieldTitleSpot != 0) {
  4814.                         fieldContents[j] = fieldContents[j].substr(fieldTitleSpot + fieldTitleLength);
  4815.                     } else {
  4816.                         fieldContents[j] = fieldContents[j].substr(fieldTitleLength);
  4817.                     }
  4818.                             
  4819.                     dataTags[fieldTitle] = fieldContents[j].replace(/^\s*|\s*$/g, '''');
  4820.                     fieldContents[j] = '''';
  4821.                 }
  4822.             }
  4823.         }
  4824.  
  4825.     } else if (mediaType1 == "book") {
  4826.         var newItem = new Zotero.Item("book");
  4827.         
  4828.         if (doc.evaluate(''//div[@class="darkBorder roundbox"][@id="main"]/table/tbody/tr/td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4829.             var headers = doc.evaluate(''//div[@class="darkBorder roundbox"][@id="main"]/table/tbody/tr/td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4830.             var contents = doc.evaluate(''//div[@class="darkBorder roundbox"][@id="main"]/table/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4831.             
  4832.             var next_title;
  4833.             while (next_title = headers.iterateNext()) {
  4834.                 fieldTitle = next_title.textContent.toLowerCase().replace(/\s+/g, '''');
  4835.                 if (!fieldTitle.match(":")) {
  4836.                     fieldTitle = fieldTitle + ":";
  4837.                 }
  4838.                 fieldContent = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  4839.                 dataTags[fieldTitle] = fieldContent;
  4840.             }
  4841.         }
  4842.         
  4843.     } else if (mediaType1 == "videoRecording") {
  4844.         var newItem = new Zotero.Item("videoRecording");
  4845.         scrapeType = 1;
  4846.  
  4847.     } else if (mediaType1 == "audioRecording") {
  4848.         var newItem = new Zotero.Item("audioRecording");
  4849.         scrapeType = 1;
  4850.     } 
  4851.     
  4852.     if (scrapeType == 1) {
  4853.         var xPathHeaders = ''//div[@class="darkBorder roundbox"][@id="main"]/p[@class="content"]/span[@class="key"]'';
  4854.         
  4855.         if (doc.evaluate(''xPathHeaders'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4856.             var headers = doc.evaluate(''xPathHeaders'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4857.             var contents =  doc.evaluate(''//span[@class="value"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4858.             
  4859.             var next_title;
  4860.             while (next_title = headers.iterateNext()) {
  4861.                 fieldTitle = next_title.textContent.toLowerCase().replace(/\s+/g, '''');
  4862.                 fieldContent = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  4863.                 dataTags[fieldTitle] = fieldContent;
  4864.             }
  4865.         }
  4866.     }
  4867.     
  4868.     if (dataTags["creator:"]) {
  4869.         var author = dataTags["creator:"];
  4870.         if (author.match(", ")) {
  4871.             var authors = author.split(", ");
  4872.             author = authors[1] + " " + authors[0];
  4873.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "creator"));
  4874.         } else {
  4875.             newItem.creators.push({lastName: author, creatorType: "creator"});
  4876.         }
  4877.     }
  4878.     
  4879.     if (dataTags["author:"]) {
  4880.         var author = dataTags["author:"];
  4881.         if (author.match(", ")) {
  4882.             var authors = author.split(", ");
  4883.             author = authors[1] + " " + authors[0];
  4884.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  4885.         } else {
  4886.             newItem.creators.push({lastName: author, creatorType: "author"});
  4887.         }
  4888.     }
  4889.     
  4890.     if (doc.evaluate(''//div[@class="box"][@id="description"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4891.         newItem.title = doc.evaluate(''//div[@class="box"][@id="description"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4892.     } else if (doc.evaluate(''//div[@class="darkBorder roundbox"][@id="main"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4893.         newItem.title = doc.evaluate(''//div[@class="darkBorder roundbox"][@id="main"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4894.     } else {
  4895.         newItem.title = doc.title;
  4896.     }
  4897.     
  4898.     var tagsCount = "none";
  4899.     if (dataTags["keywords:"]) {
  4900.         if (dataTags["keywords:"].match(";")) {
  4901.             var tagsContent = (dataTags["keywords:"].split(";"));
  4902.             tagsCount = "multiple";
  4903.         } else if (dataTags["keywords:"].match(", ")) {
  4904.             var tagsContent = (dataTags["keywords:"].split(", "));
  4905.             tagsCount = "multiple";
  4906.         } else {
  4907.             var tagsContent = (dataTags["keywords:"]);
  4908.             tagsCount = "one";
  4909.         }
  4910.         if (tagsCount == "multiple") {
  4911.             for (var i = 0; i < tagsContent.length; i++) {
  4912.                      newItem.tags[i] = tagsContent[i];
  4913.                  }
  4914.         } else if (tagsCount == "one") {
  4915.             newItem.tags = tagsContent;
  4916.         }
  4917.     }
  4918.     
  4919.     if (dataTags["publisher:"]) {
  4920.         if (dataTags["publisher:"].match(":")) {
  4921.             var place1 = dataTags["publisher:"].split(":");
  4922.             newItem.place = place1[0];
  4923.             newItem.publisher = place1[1];
  4924.         } else {
  4925.             associateData (newItem, dataTags, "publisher:", "publisher");
  4926.         }
  4927.     }
  4928.     
  4929.     if (dataTags["rights:"]) {
  4930.         associateData (newItem, dataTags, "rights:", "rights");
  4931.     } else if (dataTags["creativecommonslicense:"]) {
  4932.         newItem.rights = "Creative Commons License: " + dataTags["creativecommonslicense:"];
  4933.     }
  4934.     
  4935.     associateData (newItem, dataTags, "title:", "title");;
  4936.     associateData (newItem, dataTags, "date:", "date");
  4937.     associateData (newItem, dataTags, "callnumber:", "callNumber");
  4938.     
  4939.     newItem.url = doc.location.href;
  4940.  
  4941.     newItem.complete();
  4942. }
  4943.  
  4944. function doWeb(doc, url) {
  4945.     var namespace = doc.documentElement.namespaceURI;
  4946.     var nsResolver = namespace ? function(prefix) {
  4947.         if (prefix == ''x'') return namespace; else return null;
  4948.     } : null;
  4949.     
  4950.     var articles = new Array();
  4951.     
  4952.     if (detectWeb(doc, url) == "multiple") {
  4953.         var items = new Object();
  4954.         
  4955.         var titles = doc.evaluate(''//td[2][@class="hitCell"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4956.         var titlesCount = doc.evaluate(''count (//td[2][@class="hitCell"]/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  4957.         
  4958.         Zotero.debug(titlesCount.numberValue);
  4959.         
  4960.         var next_title;
  4961.         for (var i = 0; i < titlesCount.numberValue; i++) {
  4962.             next_title = titles.iterateNext();
  4963.             
  4964.             while (!next_title.href.match(/details/)) {
  4965.                 i++;
  4966.                 if (i == titlesCount.numberValue) {
  4967.                     Zotero.debug(i);
  4968.                     break;
  4969.                 }
  4970.                 next_title = titles.iterateNext();            
  4971.             }
  4972.             
  4973.             if (next_title.href.match(/details/)) {
  4974.                 items[next_title.href] = next_title.textContent;
  4975.             }
  4976.         }
  4977.         
  4978.         items = Zotero.selectItems(items);
  4979.         for (var i in items) {
  4980.             articles.push(i);
  4981.         }
  4982.     } else {
  4983.         articles = [url];
  4984.     }
  4985.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  4986.     Zotero.wait();
  4987. }');
  4988.  
  4989. REPLACE INTO translators VALUES ('513a53f5-b95e-4df6-a03e-3348d9ec9f44', '1.0', '', '2008-12-03 19:00:00', 1, 100, 4, 'Internet Archive Wayback Machine', 'Sean Takats', '^http://web.archive.org/web/',
  4990. 'function detectWeb(doc, url){
  4991.     var namespace = doc.documentElement.namespaceURI;
  4992.     var nsResolver = namespace ? function(prefix) {
  4993.             if (prefix == "x") return namespace; else return null;
  4994.         } : null;
  4995.     var xpath = ''//td[@class="mainBody"]/a'';
  4996.     var links = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  4997.     if (links.iterateNext()){
  4998.         return "multiple";
  4999.     }
  5000.     return "webpage";    
  5001. }', 
  5002. 'function doWeb(doc, url){
  5003.     var uris = new Array();
  5004.     var dateRe = new RegExp("^http://web.archive.org/web/([0-9]+)"); 
  5005.     if (dateRe.test(url)){ //handle single item
  5006.         uris.push(url);
  5007.     } else{//handle multiple items
  5008.         var namespace = doc.documentElement.namespaceURI;
  5009.         var nsResolver = namespace ? function(prefix) {
  5010.                 if (prefix == "x") return namespace; else return null;
  5011.             } : null;
  5012.         var xpath = ''//td[@class="mainBody"]/a'';
  5013.         var links = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5014.         var items=new Array();
  5015.         var link;
  5016.         while (link = links.iterateNext()){
  5017.             items[link.href] = link.textContent;
  5018.         }
  5019.         items=Zotero.selectItems(items);
  5020.         for (var i in items) {
  5021.             uris.push(i);
  5022.         }
  5023.     }
  5024.     Zotero.Utilities.processDocuments(uris, function(newDoc) {
  5025.         //create new webpage Item from page
  5026.         var newItem = new Zotero.Item("webpage");
  5027.         newItem.title = newDoc.title;
  5028.         //parse date and add
  5029.         var m = dateRe.exec(newDoc.location.href);
  5030.         var date = m[1];
  5031.         date = date.substr(0, 4) + "-" + date.substr(4,2) + "-" + date.substr(6,2);
  5032.         newItem.date = date;
  5033.         //create snapshot
  5034.         newItem.attachments = [{url:newDoc.location.href, title:newDoc.title, mimeType:"text/html"}];
  5035.         newItem.complete();
  5036.     }, function() {Zotero.done;});
  5037.     Zotero.wait();
  5038. }');
  5039.  
  5040. REPLACE INTO translators VALUES ('d1605270-d7dc-459f-9875-74ad8dde1f7d', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'Le Devoir', 'Adam Crymble', 'http://www.ledevoir.com', 
  5041. 'function detectWeb(doc, url) {
  5042.     if (doc.location.href.match("Recherche")) {
  5043.         return "multiple";
  5044.     } else if (doc.evaluate(''//div[@id="autresArticles"]/p'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  5045.         return "newspaperArticle";
  5046.     }
  5047. }', 
  5048. '//Le Devoir Translator. Code by Adam Crymble
  5049.  
  5050. function scrape(doc, url) {
  5051.  
  5052.     var namespace = doc.documentElement.namespaceURI;
  5053.     var nsResolver = namespace ? function(prefix) {
  5054.         if (prefix == ''x'') return namespace; else return null;
  5055.     } : null;    
  5056.  
  5057.     var tagsContent = new Array();
  5058.     
  5059.     var newItem = new Zotero.Item("newspaperArticle");
  5060.     
  5061.     var contents = doc.evaluate(''//div[@id="autresArticles"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5062.  
  5063.     var j = 0;
  5064.     var n = 0;
  5065.     var contentsArray = new Array();
  5066.     var contents1;
  5067.     
  5068.     while (contents1 = contents.iterateNext()) {
  5069.         contentsArray.push(contents1.textContent);
  5070.         j++;
  5071.     }         
  5072.          
  5073.          var author;
  5074.          var author1;
  5075.          var author2;
  5076.          
  5077.          if (j > 1) {
  5078.              for (var i in contentsArray) {
  5079.                  if (contentsArray[i].match("├ëdition du ")) {
  5080.                      var date1 = contentsArray[i].split("├ëdition du ");
  5081.                      
  5082.                      newItem.date = date1[1];
  5083.                      
  5084.                      if (date1[0].match(/\w/)) {
  5085.                 
  5086.                          author = date1[0];
  5087.                          if (author.match(/\n/)) {
  5088.                              author1 = author.split(/\n/);
  5089.                              
  5090.                               for (var k = 0; k < author1.length; k++) {
  5091.                                   if (author1[k].match(/\w/) && author1[k].match(", ")) {
  5092.                                      author2 = author1[k].split(", ");
  5093.                                  if (author2[0].match(/\w/)) {
  5094.                                      newItem.creators.push(Zotero.Utilities.cleanAuthor(author2[0], "author"));    
  5095.                                  } else {
  5096.                                       newItem.creators.push(Zotero.Utilities.cleanAuthor(author2[1], "author"));    
  5097.                                  }
  5098.                                   } else if (author1[k].match(/\w/) && !author1[k].match(", ")) {
  5099.                                       newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author"));    
  5100.                                   }
  5101.                               }
  5102.                          } else if (author.match(" et ")) {
  5103.                              author1 = author.split(" et ");
  5104.                              for (var k in author1) {
  5105.                                  newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author"));    
  5106.                              }
  5107.                          } else if (author.match(", ")) {
  5108.                              author1 = author.split(", ");
  5109.                              for (var k in author1) {
  5110.                                  newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author"));    
  5111.                              }
  5112.                          } else {
  5113.                              newItem.creators.push(Zotero.Utilities.cleanAuthor(date1[0], "author"));    
  5114.                          }
  5115.                      }
  5116.                  } else if (contentsArray[i].match("Mots cl├⌐s")) {
  5117.                      contentsArray[i] = contentsArray[i].substr(11);
  5118.                      if (contentsArray[i].match(", ")) {
  5119.                          tagsContent = contentsArray[i].split(", ");
  5120.                      } else {
  5121.                          newItem.tags = ontentsArray[i];
  5122.                          n = 1;
  5123.                      }
  5124.                  }
  5125.              }
  5126.          }
  5127.          
  5128.          if (n == 0 && tagsContent.length>1) {
  5129.              for (var i = 0; i < tagsContent.length; i++) {
  5130.                  newItem.tags[i] = tagsContent[i];
  5131.              }
  5132.          }
  5133.  
  5134.     newItem.title = doc.title;    
  5135.     newItem.url = doc.location.href;
  5136.     newItem.publicationTitle = "Le Devoir";
  5137.     newItem.ISSN = "0319-0722";
  5138.  
  5139.     newItem.complete();
  5140. }
  5141.  
  5142. function doWeb(doc, url) {
  5143.     var namespace = doc.documentElement.namespaceURI;
  5144.     var nsResolver = namespace ? function(prefix) {
  5145.         if (prefix == ''x'') return namespace; else return null;
  5146.     } : null;
  5147.     
  5148.     var articles = new Array();
  5149.     
  5150.     if (detectWeb(doc, url) == "multiple") {
  5151.         var items = new Object();
  5152.     
  5153.         var titles = doc.evaluate(''//td[2]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5154.     
  5155.         var next_title;
  5156.         while (next_title = titles.iterateNext()) {
  5157.             items[next_title.href] = next_title.textContent;
  5158.         }
  5159.         items = Zotero.selectItems(items);
  5160.         for (var i in items) {
  5161.             articles.push(i);
  5162.         }
  5163.     } else {
  5164.         articles = [url];
  5165.     }
  5166.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  5167.     Zotero.wait();
  5168. }');
  5169.  
  5170.  
  5171. REPLACE INTO translators VALUES ('22d17fb9-ae32-412e-bcc4-7650ed3359bc', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'Musee du Louvre', 'Adam Crymble', 'http://www.louvre.fr', 
  5172. 'function detectWeb(doc, url) {
  5173.     if (doc.location.href.match("recherche")) {
  5174.         return "multiple";
  5175.     } else if (doc.evaluate(''//div[@class="alignRight"]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  5176.         return "artwork";
  5177.     }
  5178.     
  5179. }', 
  5180. '//Translator Musee du Louvre. Code by Adam Crymble
  5181.  
  5182. function scrape(doc, url) {
  5183.  
  5184.     var namespace = doc.documentElement.namespaceURI;
  5185.     var nsResolver = namespace ? function(prefix) {
  5186.         if (prefix == ''x'') return namespace; else return null;
  5187.     } : null;    
  5188.     
  5189.     var dataTags = new Object();
  5190.     var tagsContent = new Array();
  5191.     
  5192.     var newItem = new Zotero.Item("artwork");
  5193.  
  5194.     //tags    
  5195.         var metaTagHTML = doc.getElementsByTagName("meta");
  5196.         for (var i = 0 ; i < metaTagHTML.length ; i++) {
  5197.             dataTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  5198.         }
  5199.         
  5200.         newItem.abstractNote = dataTags["description"];
  5201.         
  5202.         if (dataTags["keywords"]) {
  5203.             if (dataTags["keywords"].match(", ")) {
  5204.                 tagsContent = tagsContent = dataTags["keywords"].split(", ");
  5205.             } else if (dataTags["keywords"].split("πÇü")) {
  5206.                 tagsContent = dataTags["keywords"].split("πÇü");
  5207.             }
  5208.         }
  5209.         
  5210.         for (var i = 0; i < tagsContent.length; i++) {
  5211.             newItem.tags[i] = tagsContent[i];
  5212.         }
  5213.         
  5214.     //date    
  5215.         var xPathDate = ''//td[@class="txtContent"]/span[@class="txtContentSmall"]'';
  5216.         
  5217.         if (doc.evaluate(xPathDate, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5218.             
  5219.             newItem.date = doc.evaluate(xPathDate, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  5220.         }
  5221.     
  5222.     //creator    
  5223.         var xPathCreator = ''//td[@class="txtContent"]/strong'';
  5224.         if (doc.evaluate(xPathCreator, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5225.             var creator = doc.evaluate(xPathCreator, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.toLowerCase();
  5226.         
  5227.             var comma = 0;
  5228.             var parenthesis = 0;
  5229.             var commaSpot;
  5230.             var parenthesisSpot;
  5231.             
  5232.             if (creator.match(", ")) {
  5233.                 comma = 1;
  5234.                 commaSpot = creator.indexOf(",");
  5235.             }
  5236.             
  5237.             if (creator.match(/\(/)) {
  5238.                 parenthesis = 1;
  5239.                 parenthesisSpot = creator.indexOf(" (");
  5240.             } 
  5241.             
  5242.             if (comma == 1 && parenthesis == 1) {
  5243.                 if (commaSpot < parenthesisSpot) {
  5244.                     creator = creator.substr(0, commaSpot);
  5245.                 } else {
  5246.                     creator = creator.substr(0, parenthesisSpot);
  5247.                 }
  5248.             } else if (comma == 1 && parenthesis == 0) {
  5249.                 creator = creator.substr(0, commaSpot);    
  5250.             } else if (comma == 0 && parenthesis == 1) {
  5251.                 creator = creator.substr(0, parenthesisSpot);
  5252.             }
  5253.         
  5254.             var words = creator.split(" ");
  5255.             
  5256.             for (var j in words) {
  5257.                 if (words[j] != "" && words[j] != '' '') {
  5258.                     if (words[j].match("-")) {
  5259.                         Zotero.debug(words[j]);
  5260.                         var hyphen = words[j].split("-");
  5261.                         hyphen[0] = hyphen[0][0].toUpperCase() + hyphen[0].substr(1).toLowerCase() + "-";
  5262.                         hyphen[1] = hyphen[1][0].toUpperCase() + hyphen[1].substr(1).toLowerCase();
  5263.                         words[j] = hyphen[0] + hyphen[1];
  5264.                     } else {
  5265.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  5266.                     }
  5267.                 }
  5268.             }
  5269.             creator = words.join(" ");
  5270.             newItem.creators.push(Zotero.Utilities.cleanAuthor(creator, "artist"));
  5271.         }
  5272.         
  5273.     
  5274.     //title
  5275.         var title1 = doc.title.split(" |");
  5276.         Zotero.debug(title1[0]);
  5277.         newItem.title = title1[0];    
  5278.         
  5279.     //extra
  5280.         if (doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5281.         
  5282.             var collection1 = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  5283.             newItem.extra = collection1.replace(/^\s*|\s*$/g, '''');
  5284.         }
  5285.         
  5286.         newItem.repository = "Mus├⌐e du Louvre";
  5287.         newItem.url = doc.location.href;
  5288.     
  5289.         newItem.complete();
  5290. }
  5291.  
  5292. function doWeb(doc, url) {
  5293.     var namespace = doc.documentElement.namespaceURI;
  5294.     var nsResolver = namespace ? function(prefix) {
  5295.         if (prefix == ''x'') return namespace; else return null;
  5296.     } : null;
  5297.     
  5298.     var articles = new Array();
  5299.     
  5300.     if (detectWeb(doc, url) == "multiple") {
  5301.         var items = new Object();
  5302.  
  5303.         var links = doc.evaluate(''//td[4][@class="alignTop"]/a[@class="lkContent"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5304.         var titles = doc.evaluate(''//h4'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5305.         
  5306.         var next_title;
  5307.         while (next_title = titles.iterateNext()) {
  5308.             items[links.iterateNext().href] = next_title.textContent;
  5309.         }
  5310.         items = Zotero.selectItems(items);
  5311.         for (var i in items) {
  5312.             articles.push(i);
  5313.         }
  5314.     } else {
  5315.         articles = [url];
  5316.     }
  5317.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  5318.     Zotero.wait();    
  5319. }');
  5320.  
  5321.  
  5322. REPLACE INTO translators VALUES ('5b02e8d4-d8fb-4143-af3d-3576d4c1b49c', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'National Archives of South Africa', 'Adam Crymble', 'http://www.national.archsrch.gov.za', 
  5323. 'function detectWeb(doc, url) {
  5324.     if (doc.title.match("Results Summary")) {
  5325.         return "multiple";
  5326.     } else if (doc.title.match("Results Detail")) {
  5327.         return "book";
  5328.     }
  5329. }', 
  5330. '//National Archives of South Africa Translator. Code by Adam Crymble
  5331.  
  5332. function associateData (newItem, dataTags, field, zoteroField) {
  5333.     if (dataTags[field]) {
  5334.         newItem[zoteroField] = dataTags[field];
  5335.     }
  5336. }
  5337.  
  5338. function scrape(doc, url) {
  5339.  
  5340.     var namespace = doc.documentElement.namespaceURI;
  5341.     var nsResolver = namespace ? function(prefix) {
  5342.         if (prefix == ''x'') return namespace; else return null;
  5343.     } : null;    
  5344.     
  5345.     var dataTags = new Object();
  5346.     var tagsContent = new Array();
  5347.     var fieldTitle;
  5348.     
  5349.     var newItem = new Zotero.Item("book");
  5350.  
  5351.  
  5352.          var headers = doc.evaluate(''//td[2]/pre/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5353.          var xPathCount = doc.evaluate(''count (//td[2]/pre/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5354.          var contents = doc.evaluate(''//td[2]/pre'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  5355.          
  5356.          var headersArray = new Array();
  5357.     var oneHeader = '''';
  5358.  
  5359.     if (xPathCount.numberValue > 1) {
  5360.         for (var i = 0; i < xPathCount.numberValue; i++) {
  5361.             fieldTitle = headers.iterateNext().textContent;
  5362.             headersArray.push(fieldTitle);
  5363.         }
  5364.     } else {
  5365.         oneHeader = (headers.iterateNext().textContent);
  5366.     }
  5367.     
  5368.     var contentsArray = new Array();
  5369.     var j = 0;
  5370.     
  5371.     if (oneHeader.length<1) {
  5372.     
  5373.         for (var i = headersArray.length-1; i> -1; i--) {         
  5374.         
  5375.             var fieldIndex = contents.indexOf(headersArray[i]);
  5376.             var shorten = headersArray[i].length;
  5377.             
  5378.             contentsArray.push(contents.substr(fieldIndex));
  5379.             contents = contents.substr(0, fieldIndex);
  5380.             fieldTitle = headersArray[i].replace(/\s+/g, '''');
  5381.             
  5382.             dataTags[fieldTitle] = contentsArray[j].substr(shorten).replace(/^\s*|\s+$/g, '''');
  5383.             j++;
  5384.         }
  5385.     } 
  5386.  
  5387.     associateData (newItem, dataTags, "DEPOT", "repository");
  5388.     associateData (newItem, dataTags, "REFERENCE", "callNumber");
  5389.     associateData (newItem, dataTags, "STARTING", "date");
  5390.     associateData (newItem, dataTags, "ENDING", "date");
  5391.     associateData (newItem, dataTags, "VOLUME_NO", "volume");
  5392.     associateData (newItem, dataTags, "REMARKS", "extra");
  5393.     associateData (newItem, dataTags, "SUMMARY", "abstractNote");
  5394.  
  5395.     if (dataTags["DESCRIPTION"]) {
  5396.         associateData (newItem, dataTags, "DESCRIPTION", "title");
  5397.     } else {
  5398.         newItem.title = "No Title Found";    
  5399.     }
  5400.     
  5401.     newItem.url = doc.location.href;
  5402.  
  5403.     newItem.complete();
  5404. }
  5405.  
  5406. function doWeb(doc, url) {
  5407.     var namespace = doc.documentElement.namespaceURI;
  5408.     var nsResolver = namespace ? function(prefix) {
  5409.         if (prefix == ''x'') return namespace; else return null;
  5410.     } : null;
  5411.     
  5412.     var articles = new Array();
  5413.     
  5414.     if (detectWeb(doc, url) == "multiple") {
  5415.         var items = new Object();
  5416.         
  5417.         var titles = doc.evaluate(''//td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5418.         
  5419.         var lastLink;
  5420.         var next_title;
  5421.         while (next_title = titles.iterateNext()) {
  5422.             
  5423.             if (!next_title.textContent.match(/^\d\d\d\d/) && !next_title.textContent.match(/\\/) && next_title.textContent.length>3 && next_title.textContent.match(/\w/)) {
  5424.                 Zotero.debug(next_title.textContent);
  5425.                 items[next_title.href] = next_title.textContent;
  5426.             }
  5427.  
  5428.         }
  5429.         items = Zotero.selectItems(items);
  5430.         for (var i in items) {
  5431.             articles.push(i);
  5432.         }
  5433.     } else {
  5434.         articles = [url];
  5435.     }
  5436.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  5437.     Zotero.wait();
  5438. }');
  5439.  
  5440.  
  5441. REPLACE INTO translators VALUES ('ed28758b-9c39-4e1c-af89-ce1c9202b70f', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'National Gallery of Art - U.S.A.', 'Adam Crymble', 'http://www.nga.gov/', 
  5442. 'function detectWeb(doc, url) {
  5443.     var single = 0;
  5444.     
  5445.     if (doc.evaluate(''//div[@class="content"]/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()){
  5446.         var pageType = doc.evaluate(''//div[@class="content"]/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src;
  5447.     }
  5448.     
  5449.     if (doc.location.href.match("tinfo") || doc.title.match("timage")) {
  5450.         single = "1";
  5451.     }
  5452.     
  5453.     
  5454.     
  5455.     if (doc.title.match("Image") && doc.location.href.match("fcgi")) {
  5456.         return "artwork";
  5457.     }
  5458.     
  5459.     if (pageType.match("search_test")) {
  5460.         return "multiple";
  5461.     } else if (doc.location.href.match("artistid")) {
  5462.         return "multiple";
  5463.     } else if (single == "1" && pageType.match("collections_test")) {
  5464.         return "artwork";
  5465.     }     
  5466. }', 
  5467. '//National Gallery USA translator. Code by Adam Crymble
  5468.  
  5469. function scrape(doc, url) {
  5470.     var namespace = doc.documentElement.namespaceURI;
  5471.     var nsResolver = namespace ? function(prefix) {
  5472.         if (prefix == ''x'') return namespace; else return null;
  5473.     } : null;
  5474.     
  5475.     var style = 0;
  5476.     var title1;
  5477.     var newItem = new Zotero.Item("artwork");
  5478.     
  5479.     //determines page layout type
  5480.  
  5481.     //single entry with thumbnail
  5482.     if (doc.evaluate(''//div[@class="BodyText"]/table/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5483.  
  5484.         var content = doc.evaluate(''//div[@class="BodyText"]/table/tbody/tr/td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/);
  5485.         style = 1;
  5486.         
  5487.     //single entry without thumbnail (2 variations)        
  5488.     } else if  (doc.evaluate(''//div[@class="BodyText"]/table/tbody/tr/td'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5489.     
  5490.         var content = doc.evaluate(''//div[@class="BodyText"]/table/tbody/tr/td'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/);
  5491.         
  5492.         if (content[1].match("Rendered")) {
  5493.             style = 3;
  5494.         } else {
  5495.             style = 1;
  5496.         }
  5497.  
  5498.     //single entry with large image.        
  5499.     } else if (doc.evaluate(''//tr[2]/td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5500.     
  5501.         var content = doc.evaluate(''//tr[2]/td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/);
  5502.         style = 2;
  5503.     }
  5504.  
  5505.     if (style == 1) {
  5506.         
  5507.         newItem.creators.push(Zotero.Utilities.cleanAuthor(content[1], "artist"));
  5508.     
  5509.     
  5510.         var titleDate = content[3].split(", ");
  5511.         title1 = titleDate[0];
  5512.         
  5513.         if (titleDate.length>2) {
  5514.             for (var j = 1; j < titleDate.length-1; j++) {
  5515.                 title1 = (title1 + ", " + titleDate[j]);
  5516.             }
  5517.         }
  5518.         newItem.title = title1;
  5519.         
  5520.         if (titleDate.length > 1) {
  5521.             newItem.date = titleDate[titleDate.length-1];    
  5522.         }
  5523.         
  5524.         newItem.extra = ("Aquisition: " + content[content.length-3]);
  5525.         newItem.callNumber = content[content.length-2];
  5526.         
  5527.     } else if (style == 2) {
  5528.         newItem.creators.push(Zotero.Utilities.cleanAuthor(content[0], "artist"));
  5529.         
  5530.         var date = content[1].split(", ");
  5531.         
  5532.         title1 = date[0];
  5533.         
  5534.         if (date.length>2) {
  5535.             for (var j = 1; j < date.length-1; j++) {
  5536.                 title1 = (title1 + ", " + date[j]);
  5537.             }
  5538.         }
  5539.         
  5540.         newItem.title = title1;
  5541.                 
  5542.         newItem.date = date[date.length-1];
  5543.         
  5544.         var acquisition = content[2].split(/\d/);
  5545.         newItem.extra = ("Aquisition: " + acquisition[0]);
  5546.         
  5547.     } else if (style == 3) {
  5548.         
  5549.         var titleAuthor = content[1].split("Rendered by ");
  5550.         
  5551.         newItem.title = titleAuthor[0];
  5552.         newItem.creators.push(Zotero.Utilities.cleanAuthor(titleAuthor[1], "artist"));
  5553.         
  5554.         newItem.callNumber = content[content.length-2];
  5555.         
  5556.     }
  5557.     
  5558.     newItem.url = doc.location.href;
  5559.     newItem.complete();
  5560. }
  5561.  
  5562. function doWeb(doc, url) {
  5563.     var namespace = doc.documentElement.namespaceURI;
  5564.     var nsResolver = namespace ? function(prefix) {
  5565.         if (prefix == ''x'') return namespace; else return null;
  5566.     } : null;
  5567.     
  5568.     var articles = new Array();
  5569.     
  5570.     if (detectWeb(doc, url) == "multiple") {
  5571.         var items = new Object();
  5572.         
  5573.         if (doc.location.href.match("artistid")) {
  5574.             var titles = doc.evaluate(''//ul/li/b/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5575.             
  5576.         } else {
  5577.             var titles = doc.evaluate(''//ul/li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5578.         }
  5579.         
  5580.         var next_title;
  5581.         while (next_title = titles.iterateNext()) {
  5582.             if (next_title.textContent.match("image available")) {
  5583.                 next_title = titles.iterateNext();
  5584.             }
  5585.             items[next_title.href] = next_title.textContent;
  5586.         }
  5587.         items = Zotero.selectItems(items);
  5588.         for (var i in items) {
  5589.             articles.push(i);
  5590.         }
  5591.     } else {
  5592.         articles = [url];
  5593.     }
  5594.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  5595.     Zotero.wait();
  5596. }');
  5597.  
  5598.  
  5599. REPLACE INTO translators VALUES ('54ac4ec1-9d07-45d3-9d96-48bed3411fb6', '1.0.0b4.r5', '', '2009-02-08 22:10:00', 1, 100, 4, 'National Library of Australia (new catalog)', 'Mark Triggs and Steve McPhillips', 'catalogue.nla.gov.au',
  5600. 'function detectWeb(doc, url) {
  5601.     if (url.match("/Record/[0-9]+")) {
  5602.         var format = Zotero.Utilities.cleanString(doc.getElementById("myformat").textContent);
  5603.  
  5604.         if (format == "Audio") {
  5605.             return "audioRecording";
  5606.         }
  5607.         else if (format == "Book") {
  5608.             return "book";
  5609.         }
  5610.         else if (format == "Journal/Newspaper") {
  5611.             return "journalArticle";
  5612.         }
  5613.         else if (format == "Manuscript") {
  5614.             return "manuscript";
  5615.         }
  5616.         else if (format == "Map") {
  5617.             return "map";
  5618.         }
  5619.         else if (format == "Music") {
  5620.             return "audioRecording";
  5621.         }
  5622.         else if (format == "Online") {
  5623.             return "webpage";
  5624.         }
  5625.         else if (format == "Picture") {
  5626.             return "artwork";
  5627.         }
  5628.         else if (format == "Video") {
  5629.             return "videoRecording";
  5630.         }
  5631.         else {
  5632.             return "book";
  5633.         }
  5634.     } else if (url.match ("/Search/Home") &&
  5635.                doc.getElementById ("resultItemLine1")) {
  5636.         return "multiple";
  5637.     }
  5638. }',
  5639. 'function as_array(obj) {
  5640.     if (obj instanceof Array) {
  5641.         return obj;
  5642.     } else {
  5643.         return [obj];
  5644.     }
  5645. }
  5646.  
  5647.  
  5648. function load_item(responseText, requestObject, format) {
  5649.     var metadata = JSON.parse(Zotero.Utilities.cleanString(responseText));
  5650.     var newItem = new Zotero.Item(format);
  5651.  
  5652.     /* load in our authors */
  5653.     if (metadata.authors) {
  5654.         for (var i=0; i< metadata.authors.length ; i++) {
  5655.             newItem.creators.push(Zotero.Utilities.cleanAuthor
  5656.                                   (metadata.authors[i], "author", true));
  5657.         }
  5658.     }
  5659.  
  5660.     /* and our tags */
  5661.     if (metadata.tags) {
  5662.         for (var i=0; i< metadata.tags.length ; i++) {
  5663.             newItem.tags.push(metadata.tags[i]);
  5664.         }
  5665.     }
  5666.     
  5667.     /* and our summary */
  5668.     if (metadata.notes) {
  5669.         newItem.notes.push ({"note": metadata.notes});
  5670.     }
  5671.  
  5672.     /* and everything else */
  5673.     for (var attr in metadata) {
  5674.         if (!newItem[attr]) {
  5675.             newItem[attr] = metadata[attr];
  5676.         }
  5677.     }
  5678.     newItem.repository = "National Library of Australia";
  5679.     newItem.complete();
  5680. }
  5681.  
  5682. function doWeb(doc, url) {
  5683.     format = detectWeb(doc, url);
  5684.  
  5685.     items = [];
  5686.     if (format == "multiple") {
  5687.         for (var url in Zotero.selectItems((Zotero.Utilities.getItemArray
  5688.                                             (doc, doc, "/Record/[0-9]+")))) {
  5689.             items.push(url);
  5690.         }
  5691.     } else {
  5692.         items.push(url);
  5693.     }
  5694.  
  5695.     if (items.length > 0) {
  5696.         Zotero.Utilities.processDocuments(items, function(onedoc) {
  5697.                 handleDocument(onedoc);
  5698.             }, function() { Zotero.done(); });
  5699.  
  5700.         Zotero.wait();
  5701.     }
  5702. }
  5703.  
  5704.  
  5705. function handleDocument(doc) {
  5706.     bibid = doc.location.href.match("^.*\/Record/([0-9]+)")[1];
  5707.     format = detectWeb(doc, doc.location.href);
  5708.     Zotero.Utilities.HTTP.doGet("http://catalogue.nla.gov.au/Record/" +
  5709.                                 bibid +
  5710.                                 "/Export?style=zotero",
  5711.                                 function(text, obj) {
  5712.                                     load_item(text, obj, format);
  5713.                                 });
  5714. }');
  5715.  
  5716.  
  5717. REPLACE INTO translators VALUES ('45763818-8530-49c6-a069-34acdee1a096', '1.0.0b4.r5', '', '2008-08-11 20:40:00', '0', '100', '4', 'National Library of New Zealand', 'Adam Crymble', 'http://nlnzcat.natlib', 
  5718. 'function detectWeb(doc, url) {
  5719.     
  5720.     if (doc.title.match("Quick Record View")) {
  5721.         return "book";
  5722.     } else if (doc.title.match("Details Record View")) {
  5723.         return "book";
  5724.     } else if (doc.title.match("Catalogue Titles")) {
  5725.         return "multiple";
  5726.     }
  5727. }', 
  5728. '//National Library of New Zealand translator. Code by Adam Crymble
  5729.  
  5730. function associateData (newItem, dataTags, field, zoteroField) {
  5731.     if (dataTags[field]) {
  5732.         newItem[zoteroField] = dataTags[field];
  5733.     }
  5734. }
  5735.  
  5736. function scrape(doc, url) {
  5737.  
  5738.     var namespace = doc.documentElement.namespaceURI;
  5739.     var nsResolver = namespace ? function(prefix) {
  5740.         if (prefix == ''x'') return namespace; else return null;
  5741.     } : null;    
  5742.     
  5743.     var dataTags = new Object();
  5744.     var tagsContent = new Array();
  5745.     var headersArray = new Array();
  5746.     var contentsArray = new Array();
  5747.     var fieldTitle;
  5748.     var j = 0;
  5749.     
  5750.     var newItem = new Zotero.Item("book");
  5751.  
  5752.     var headers = doc.evaluate(''//form/table/tbody/tr/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5753.     var xPathCount = doc.evaluate(''count (//form/table/tbody/tr/th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5754.     var contents = doc.evaluate(''//table[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  5755.  
  5756.     for (var i = 0; i < xPathCount.numberValue; i++) {
  5757.         fieldTitle = headers.iterateNext().textContent;
  5758.         if (fieldTitle.match(/\w/)) {
  5759.             headersArray.push(fieldTitle);
  5760.         }
  5761.     }
  5762.     
  5763.     for (var i = headersArray.length-1; i> -1; i--) {         
  5764.     
  5765.         var fieldIndex = contents.lastIndexOf(headersArray[i]);
  5766.         contentsArray.push(contents.substr(fieldIndex));
  5767.         contents = contents.substr(0, fieldIndex);
  5768.         
  5769.         fieldTitle = headersArray[i].replace(/\s+/g, '''');
  5770.         
  5771.         dataTags[fieldTitle] = contentsArray[j].substr(headersArray[i].length).replace(/^\s*|\s+$/g, '''');
  5772.         j++;        
  5773.     }
  5774.     
  5775.     if (dataTags["Author:"]) {
  5776.         var author = dataTags["Author:"];
  5777.         if (author.match(", ")) {
  5778.             var authors = author.split(", ");
  5779.             author = authors[1] + " " + authors[0];
  5780.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  5781.         } else {
  5782.             newItem.creators.push({lastName: author, creatorType: "creator"});            
  5783.         }
  5784.     }
  5785.  
  5786.     if (dataTags["Publisher:"]) {
  5787.         if (dataTags["Publisher:"].match(": ")) {
  5788.             var place1 = dataTags["Publisher:"].indexOf(": ");
  5789.             newItem.place = dataTags["Publisher:"].substr(0, place1);
  5790.             var publisher1 = dataTags["Publisher:"].substr(place1 + 2);
  5791.             
  5792.             if (publisher1.match(", ")) {
  5793.                 var date1 = publisher1.lastIndexOf(", ");
  5794.                 newItem.date = publisher1.substr(date1 +2);
  5795.                 newItem.publisher = publisher1.substr(0, date1);
  5796.             } else {
  5797.                 newItem.publisher = publisher1;
  5798.             }
  5799.         } else {
  5800.             newItem.publisher = publisher1;
  5801.         }
  5802.     }
  5803.  
  5804.     if (dataTags["Subject:"]) {
  5805.         if (dataTags["Subject:"].match(/\n/)) {
  5806.             tagsContent = dataTags["Subject:"].split(/\n/)
  5807.             for (var i = 0; i < tagsContent.length; i++) {
  5808.                      if (tagsContent[i].match(/\w/)) {
  5809.                          newItem.tags[i] = tagsContent[i];
  5810.                      }
  5811.                  }
  5812.         } else {
  5813.             newItem.tags = dataTags["Subject:"]
  5814.         }
  5815.     }
  5816.     
  5817.     if (dataTags["LCSubject:"]) {
  5818.         if (dataTags["LCSubject:"].match(/\n/)) {
  5819.             tagsContent = dataTags["LCSubject:"].split(/\n/)
  5820.             var k = 0;
  5821.             for (var i = 0; i < tagsContent.length; i++) {
  5822.                      if (tagsContent[i].match(/\w/)) {
  5823.                          newItem.tags[k] = tagsContent[i];
  5824.                          k++;
  5825.                      }
  5826.                  }
  5827.         } else {
  5828.             newItem.tags = dataTags["LCSubject:"]
  5829.         }
  5830.     }
  5831.  
  5832.     associateData (newItem, dataTags, "Title:", "title");
  5833.     associateData (newItem, dataTags, "Description:", "pages");
  5834.     associateData (newItem, dataTags, "CallNumber:", "callNumber");
  5835.     associateData (newItem, dataTags, "Location:", "repository");
  5836.     
  5837.     newItem.url = doc.location.href;
  5838.     newItem.complete();
  5839. }
  5840.  
  5841. function doWeb(doc, url) {
  5842.     var namespace = doc.documentElement.namespaceURI;
  5843.     var nsResolver = namespace ? function(prefix) {
  5844.         if (prefix == ''x'') return namespace; else return null;
  5845.     } : null;
  5846.     
  5847.     var articles = new Array();
  5848.     
  5849.     if (detectWeb(doc, url) == "multiple") {
  5850.         var items = new Object();
  5851.         
  5852.         var titles = doc.evaluate(''//form/table/tbody/tr/td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5853.         
  5854.         var next_title;
  5855.         while (next_title = titles.iterateNext()) {
  5856.             if (next_title.textContent.match(/\w/)) {
  5857.                 items[next_title.href] = next_title.textContent;
  5858.             }
  5859.         }
  5860.         items = Zotero.selectItems(items);
  5861.         for (var i in items) {
  5862.             articles.push(i);
  5863.         }
  5864.     } else {
  5865.         articles = [url];
  5866.     }
  5867.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  5868.     Zotero.wait();
  5869. }');
  5870.  
  5871.  
  5872. REPLACE INTO translators VALUES ('1c5b122c-7e58-4cd5-932b-93f5ca0b7e1a', '1.0.0b4.r5', '', '2008-08-11 20:40:00', '0', '100', '4', 'National Post', 'Adam Crymble', 'http://www.(national|financial)post.com/', 
  5873. 'function detectWeb(doc, url) {
  5874.     
  5875.     if (doc.title.match("Search Results")) {
  5876.         return "multiple";
  5877.     } else if (doc.location.href.match("story")) {
  5878.         return "newspaperArticle";
  5879.     } else if (doc.location.href.match("blog")) {
  5880.         return "blogPost";
  5881.     }
  5882.     
  5883. }', 
  5884. 'function associateData (newItem, dataTags, field, zoteroField) {
  5885.     if (dataTags[field]) {
  5886.         newItem[zoteroField] = dataTags[field];
  5887.     }
  5888. }
  5889.  
  5890. function scrape(doc) {
  5891.     var namespace = doc.documentElement.namespaceURI;
  5892.     var nsResolver = namespace ? function(prefix) {
  5893.         if (prefix == "x" ) return namespace; else return null;
  5894.     } : null;
  5895.     
  5896.     var dataTags = new Object();
  5897.     var author = new Array();
  5898.     
  5899.     var mediaType = detectWeb(doc,doc.location.href);
  5900.     if (mediaType == "newspaperArticle") {
  5901.         var newItem = new Zotero.Item("newspaperArticle");
  5902.     
  5903.     //metadata    
  5904.         var dataTagHTML = doc.getElementsByTagName("meta");
  5905.         for (var i = 0 ; i < dataTagHTML.length ; i++) {
  5906.             dataTags[dataTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(dataTagHTML[i].getAttribute("content"));
  5907.         }
  5908.         
  5909.         associateData (newItem, dataTags, "Description", "abstractNote");
  5910.         associateData (newItem, dataTags, "PubDate", "date");
  5911.         
  5912.     //author
  5913.         if (dataTags["Author"]) {
  5914.             newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Author"], "author"));
  5915.         } else {
  5916.         
  5917.             author = doc.evaluate(''//strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(",");
  5918.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author[0], "author"));
  5919.         }
  5920.         
  5921.     } else if (mediaType == "blogPost") {
  5922.         
  5923.         var newItem = new Zotero.Item("blogPost");
  5924.         
  5925.         var blog = doc.evaluate(''//div[@class="entryviewfooter"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  5926.         blog = blog.replace("Posted:", '''').split("by");
  5927.         newItem.date = blog[0].replace(/^\s*|\s*$/g, '''');
  5928.         
  5929.         var author = doc.evaluate(''//span[@class="MoreRecentPostsAuthor"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("by ", '''');
  5930.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  5931.     }
  5932.  
  5933.     Zotero.debug(doc.location.href);
  5934.     newItem.url = doc.location.href;
  5935.     
  5936.     // This is ACTUALLY returning This URL: http://www.nationalpost.com/components/npemail.aspx?id=591742&ref=http://www.nationalpost.com/story.html
  5937.  
  5938.  
  5939.     var title1 = doc.title;
  5940.     Zotero.debug(title1);
  5941.     
  5942.     newItem.title = title1;
  5943.     newItem.publication = "The National Post";
  5944.     newItem.ISSN =     "1486-8008";
  5945.     
  5946.     newItem.complete();
  5947. }
  5948.  
  5949.  
  5950. function doWeb(doc, url) {
  5951.     var namespace = doc.documentElement.namespaceURI;
  5952.     var nsResolver = namespace ? function(prefix) {
  5953.         if (prefix == ''x'') return namespace; else return null;
  5954.     } : null;
  5955.     
  5956.     var articles = new Array();
  5957.     
  5958.     if (detectWeb(doc, url) == "multiple") {
  5959.         var items = new Object();
  5960.         var titles = doc.evaluate(''//h3[@class="alt"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  5961.         var next_title;
  5962.         while (next_title = titles.iterateNext()) {
  5963.             if (next_title.href.match("nationalpost")) {
  5964.                 items[next_title.href] = next_title.textContent;
  5965.                 Zotero.debug(next_title.href);
  5966.                 Zotero.debug(next_title.textContent);
  5967.             }
  5968.         }
  5969.         items = Zotero.selectItems(items);
  5970.         for (var i in items) {
  5971.             articles.push(i);
  5972.         }
  5973.     } else {
  5974.         articles = [url];
  5975.     }
  5976.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  5977.     Zotero.wait();
  5978.     
  5979.     
  5980.     
  5981. }');
  5982.  
  5983.  
  5984. REPLACE INTO translators VALUES ('b10bf941-12e9-4188-be04-f6357fa594a0', '1.0.0b4.r5', '', '2008-08-11 20:40:00', '0', '100', '4', 'Old Bailey Online', 'Adam Crymble', 'http://www.oldbaileyonline.org/', 
  5985. 'function detectWeb(doc, url) {
  5986.     if (doc.location.href.match("search")) {
  5987.         return "multiple";
  5988.     } else if (doc.location.href.match("browse")) {
  5989.         return "case";
  5990.     }
  5991. }', 
  5992. '//Old Bailey Online translator. Code by Adam Crymble
  5993.  
  5994. function scrape(doc, url) {
  5995.  
  5996.     var namespace = doc.documentElement.namespaceURI;
  5997.     var nsResolver = namespace ? function(prefix) {
  5998.         if (prefix == ''x'') return namespace; else return null;
  5999.     } : null;    
  6000.     
  6001.     var tagsContent = new Array();
  6002.     var fieldTitle;
  6003.     
  6004.     var newItem = new Zotero.Item("case");
  6005.  
  6006.     var headers = doc.evaluate(''//div[@class="apparatus"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6007.     var contents = doc.evaluate(''//div[@class="apparatus"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6008.     var xPathCount = doc.evaluate(''count (//div[@class="apparatus"]/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6009.     
  6010.     var headersArray = new Array();
  6011.     var oneHeader = '''';
  6012.  
  6013.     if (xPathCount.numberValue > 1) {
  6014.         for (var i = 0; i < xPathCount.numberValue; i++) {
  6015.             fieldTitle = headers.iterateNext().textContent;
  6016.             headersArray.push(fieldTitle);
  6017.         }
  6018.     } else {
  6019.         oneHeader = (headers.iterateNext().textContent);
  6020.     }
  6021.     
  6022.     var contentsArray = new Array();
  6023.     var j = 0;
  6024.     
  6025.     if (oneHeader.length<1) {
  6026.     
  6027.         for (var i = headersArray.length-1; i> -1; i--) {         
  6028.         
  6029.             var fieldIndex = contents.indexOf(headersArray[i]);
  6030.             
  6031.             contentsArray.push(contents.substr(fieldIndex));
  6032.             contents = contents.substr(0, fieldIndex);
  6033.             fieldTitle = headersArray[i].replace(/\s+/g, '''');
  6034.             
  6035.             if (fieldTitle != "ReferenceNumber:") {
  6036.                 tagsContent.push(contentsArray[j]);
  6037.             } else {
  6038.                 newItem.extra = contentsArray[j];
  6039.             }
  6040.             j++;
  6041.         }
  6042.     } else {
  6043.  
  6044.         if (oneHeader.match("Reference")) {
  6045.             
  6046.             newItem.extra = contents;
  6047.         } else {
  6048.             newItem.tags = contents;
  6049.             var noMoreTags = 1;
  6050.         }
  6051.     }
  6052.         
  6053.     if (noMoreTags != 1) {
  6054.         for (var i = 0; i < tagsContent.length; i++) {
  6055.                  newItem.tags[i] = tagsContent[i];
  6056.              }
  6057.     }
  6058.     
  6059.     newItem.title = doc.evaluate(''//div[@class="sessionsPaperTitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;    
  6060.     newItem.url = doc.location.href;
  6061.  
  6062.     newItem.complete();
  6063. }
  6064.  
  6065. function doWeb(doc, url) {
  6066.     var namespace = doc.documentElement.namespaceURI;
  6067.     var nsResolver = namespace ? function(prefix) {
  6068.         if (prefix == ''x'') return namespace; else return null;
  6069.     } : null;
  6070.     
  6071.     var articles = new Array();
  6072.     
  6073.     if (detectWeb(doc, url) == "multiple") {
  6074.         var items = new Object();
  6075.         
  6076.         var titles = doc.evaluate(''//li/p[@class="srchtitle"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6077.             
  6078.         var next_title;
  6079.         while (next_title = titles.iterateNext()) {
  6080.             items[next_title.href] = next_title.textContent;
  6081.         }
  6082.         items = Zotero.selectItems(items);
  6083.         for (var i in items) {
  6084.             articles.push(i);
  6085.         }
  6086.     } else if (doc.evaluate(''//div[@id="main2"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6087.  
  6088.         var xmlOrText = doc.evaluate(''//div[@id="main2"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6089.  
  6090.         if (xmlOrText.textContent.match("Text")) {
  6091.             articles = [xmlOrText.href];
  6092.  
  6093.         } else {
  6094.             articles = [url];
  6095.         }
  6096.     }
  6097.  
  6098.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  6099.     Zotero.wait();    
  6100. }');
  6101.  
  6102.  
  6103. REPLACE INTO translators VALUES ('96b54986-16c7-45ea-b296-fde962d658b2', '1.0.0b4.r5', '', '2008-07-24 05:30:00', '0', '100', '4', 'The Open Library', 'Adam Crymble', 'http://openlibrary.org', 
  6104. 'function detectWeb(doc, url) {
  6105.     
  6106.     if (doc.location.href.match("search")) {
  6107.         return "multiple";
  6108.     } else if (doc.evaluate(''//div[@class="title-pad"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  6109.         return "book";
  6110.     }
  6111.     
  6112. }', 
  6113. '//Open Library Translator. Code by Adam Crymble
  6114.  
  6115. function associateData (newItem, dataTags, field, zoteroField) {
  6116.     if (dataTags[field]) {
  6117.         newItem[zoteroField] = dataTags[field];
  6118.     }
  6119. }
  6120.  
  6121. function scrape(doc, url) {
  6122.  
  6123.     var namespace = doc.documentElement.namespaceURI;
  6124.     var nsResolver = namespace ? function(prefix) {
  6125.         if (prefix == ''x'') return namespace; else return null;
  6126.     } : null;    
  6127.     
  6128.     var dataTags = new Object();
  6129.     var tagsContent = new Array();
  6130.     var fieldTitle;
  6131.     
  6132.     var newItem = new Zotero.Item("book");
  6133.  
  6134.     newItem.title = doc.evaluate(''//div[@class="title-pad"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6135.     
  6136.     if (doc.evaluate(''//div[@id="header"]/div[@class="subtitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6137.         newItem.abstractNote = doc.evaluate(''//div[@id="header"]/div[@class="subtitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6138.     }
  6139.     
  6140.     var m = 0;
  6141.     if (doc.evaluate(''//div[@id="statement"]/span[@class="book-details-italic"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6142.         var publisher = doc.evaluate(''//div[@id="statement"]/span[@class="book-details-italic"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6143.         
  6144.         var publisher1 = publisher.split(/\n/);
  6145.         for (var i= 0; i < publisher1.length; i++) {
  6146.             publisher1[i] = publisher1[i].replace(/^\s*|\s+$/g, '''');
  6147.             if  (publisher1[i].match("Published in ")) {
  6148.                 newItem.date = publisher1[i].substr(13, publisher1[i].length-3);
  6149.                 m = i+1;
  6150.             } else if (publisher1[i].match(/\(/)) {
  6151.                 newItem.place = publisher1[i];
  6152.             }
  6153.         }
  6154.  
  6155.         if (m > 0) {
  6156.             newItem.publisher = publisher1[m];
  6157.         }
  6158.     }
  6159.  
  6160.     var headers = doc.evaluate(''//td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6161.     var contents = doc.evaluate(''//td[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6162.     var xPathCount = doc.evaluate(''count (//td[1])'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6163.  
  6164.     for (i=0; i<xPathCount.numberValue; i++) {         
  6165.              fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  6166.              dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  6167.          }
  6168.  
  6169.     //author
  6170.          if (doc.evaluate(''//div[@id="statement"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6171.              var author = doc.evaluate(''//div[@id="statement"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6172.              
  6173.              var author = author.split(/\n/);
  6174.              for (var i in author) {
  6175.                  author[i] = author[i].replace(/^\s*|\s*$/g, '''');
  6176.                  if (author[i].match(/^by/)) {
  6177.                      author = author[i].substr(3);
  6178.                      
  6179.                      if (author.match(", ")) {
  6180.                          if (author.match(/\s/)) {
  6181.                              var wordcount = author.split(/\s/);
  6182.  
  6183.                              if (wordcount.length > 3) {
  6184.                              
  6185.                                  var words = author.split(", ");
  6186.                                  for (var k in words) {
  6187.                                      newItem.creators.push(Zotero.Utilities.cleanAuthor(words[k], "author"));    
  6188.                                  }
  6189.                      
  6190.                              } else {
  6191.                 
  6192.                                  var words = author.split(", ");
  6193.                                  author = words[1] + " " + words[0];
  6194.                               newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  6195.                               break;
  6196.                           }
  6197.                       }
  6198.                      } else {
  6199.                          
  6200.                          newItem.creators.push({lastName: author, creatorType: "creator"});
  6201.                          break;
  6202.                      }
  6203.                  }
  6204.              }
  6205.          }
  6206.          
  6207.     var m = 0;
  6208.     if (dataTags["Subject:"]) {
  6209.         if (dataTags["Subject:"].match(/\n/)) {
  6210.             tagsContent = dataTags["Subject:"].split(/\n/);
  6211.             for (var i = 0; i < tagsContent.length; i++) {
  6212.                      if (tagsContent[i].match(/\w/)) {
  6213.                          newItem.tags[m] = tagsContent[i];
  6214.                          m++;
  6215.                      }
  6216.                  }
  6217.         } else {
  6218.             newItem.tags = dataTags["Subject:"];
  6219.         }
  6220.     }
  6221.  
  6222.     if (dataTags["ISBN13:"]) {
  6223.         newItem.extra = "ISBN 13: " + dataTags["ISBN13:"];
  6224.     }
  6225.     
  6226.     associateData (newItem, dataTags, "Language:", "language");
  6227.     associateData (newItem, dataTags, "ISBN10:", "ISBN");
  6228.     associateData (newItem, dataTags, "Series:", "series");
  6229.     associateData (newItem, dataTags, "Edition:", "edition");
  6230.     associateData (newItem, dataTags, "Pagination:", "pages");
  6231.  
  6232.     newItem.url = doc.location.href;
  6233.     newItem.complete();
  6234. }
  6235.  
  6236. function doWeb(doc, url) {
  6237.     var namespace = doc.documentElement.namespaceURI;
  6238.     var nsResolver = namespace ? function(prefix) {
  6239.         if (prefix == ''x'') return namespace; else return null;
  6240.     } : null;
  6241.     
  6242.     var articles = new Array();
  6243.     
  6244.     if (detectWeb(doc, url) == "multiple") {
  6245.         var items = new Object();
  6246.         
  6247.         var titles = doc.evaluate(''//td[2][@class="result-text"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6248.         
  6249.         var next_title;
  6250.         while (next_title = titles.iterateNext()) {
  6251.             items[next_title.href] = next_title.textContent;
  6252.         }
  6253.         items = Zotero.selectItems(items);
  6254.         for (var i in items) {
  6255.             articles.push(i);
  6256.         }
  6257.     } else {
  6258.         articles = [url];
  6259.     }
  6260.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  6261.     Zotero.wait();
  6262. }');
  6263.  
  6264.  
  6265. REPLACE INTO translators VALUES ('6871e8c5-f935-4ba1-8305-0ba563ce3941', '1.0.0b4.r5', '', '2008-08-11 20:40:00', '0', '100', '4', 'PEI Archival Information Network', 'Adam Crymble', 'http://www.archives.pe.ca', 
  6266. 'function detectWeb(doc, url) {
  6267.     var namespace = doc.documentElement.namespaceURI;
  6268.     var nsResolver = namespace ? function(prefix) {
  6269.         if (prefix == ''x'') return namespace; else return null;
  6270.     } : null;
  6271.     
  6272.     if (doc.evaluate(''//td[2]/table/tbody/tr/td/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match("Search")) {
  6273.         return "multiple";
  6274.     
  6275.     } else if (doc.evaluate(''//td[2]/table/tbody/tr/td/p'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match("Display")){
  6276.         return "book";
  6277.     }
  6278. }', 
  6279. '//PEI Archival Information Network translator: Code by Adam Crymble
  6280.  
  6281. var authors;
  6282.  
  6283. function associateData (newItem, dataTags, field, zoteroField) {
  6284.     if (dataTags[field]) {
  6285.         newItem[zoteroField] = dataTags[field];
  6286.     }
  6287. }
  6288.  
  6289. function authors1() {
  6290.     for (var k = 0; k< authors.length; k++) { 
  6291.         if (authors[k].match(", ")) {
  6292.             var author = authors[k].split(", ");
  6293.             authors[k] = (author[1] + (" ") + author[0].replace(/^\s*|\s*$/g, ''''));
  6294.                         
  6295.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[k], "author"));          
  6296.         
  6297.         } else {
  6298.                 
  6299.             newItem.creators.push({lastName: authors[k], creatorType: "creator"}); 
  6300.         }    
  6301.     }
  6302. }
  6303.  
  6304. function scrape(doc, url) {
  6305.     var namespace = doc.documentElement.namespaceURI;
  6306.     var nsResolver = namespace ? function(prefix) {
  6307.         if (prefix == ''x'') return namespace; else return null;
  6308.     } : null;
  6309.     
  6310.     var dataTags = new Object();
  6311.     var fieldTitle;
  6312.     var contents;
  6313.     var tagsContent = new Array();
  6314.     
  6315.     newItem = new Zotero.Item("book");
  6316.  
  6317.     var xPathHeadings = doc.evaluate(''//small/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6318.     var xPathContents = doc.evaluate(''//dd'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6319.     var xPathCount = doc.evaluate(''count (//small/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6320.     
  6321.     for (i=0; i<xPathCount.numberValue; i++) {     
  6322.             
  6323.         fieldTitle  = xPathHeadings.iterateNext().textContent.replace(/\s+/g, '''');
  6324.         contents = xPathContents.iterateNext().textContent;
  6325.         
  6326.         if (fieldTitle == "AccessPoints") {
  6327.             
  6328.         //creates Author
  6329.             dataTags["Author"] = (contents.substr(11).replace(/^\s*|\s*$/g, ''''));
  6330.             contents = xPathContents.iterateNext().textContent;
  6331.             
  6332.                 authors = dataTags["Author"].split(/\n/);
  6333.                 authors1();        
  6334.                 
  6335.         //creates Other Authors (if any)                
  6336.             dataTags["OtherAuthor"] = (contents.substr(13).replace(/^\s*|\s*$/g, ''''));
  6337.             contents = xPathContents.iterateNext().textContent;
  6338.             
  6339.                 if (dataTags["OtherAuthor"].match("no Other Author access points found")) {
  6340.                     
  6341.                 } else {
  6342.                     
  6343.                     authors = dataTags["OtherAuthor"].split(/\n/);
  6344.                     authors1();
  6345.                 }
  6346.         
  6347.         //creates tags
  6348.             dataTags["subject"] = (contents);
  6349.             var tags;
  6350.             
  6351.             var tagLinks = doc.evaluate(''//dd/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6352.             var tagsLinksCount = doc.evaluate(''count (//dd/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6353.  
  6354.                 for (j = 0; j < tagsLinksCount.numberValue; j++) {
  6355.             
  6356.                     tags = tagLinks.iterateNext();
  6357.                     if (tags.href.match("subject")) {
  6358.                           tagsContent.push(tags.textContent);
  6359.                       }
  6360.                 }        
  6361.         } else {
  6362.             
  6363.             dataTags[fieldTitle] = (contents.replace(/^\s*|\s*$/g, ''''));
  6364.         }    
  6365.     }    
  6366.  
  6367.     for (var i = 0; i < tagsContent.length; i++) {
  6368.         newItem.tags[i] = tagsContent[i];
  6369.     }
  6370.     
  6371.     associateData (newItem, dataTags, "NameofRepository", "repository");
  6372.     associateData (newItem, dataTags, "DatesofCreation", "date");
  6373.     associateData (newItem, dataTags, "Identifier", "callNumber");
  6374.     associateData (newItem, dataTags, "PhysicalDescription", "extra");
  6375.     associateData (newItem, dataTags, "ScopeAndContent", "abstractNote");
  6376.     associateData (newItem, dataTags, "Title/StmntofResponsibility", "title");
  6377.  
  6378.     newItem.url = doc.location.href;
  6379.     newItem.complete();
  6380. }
  6381.  
  6382. function doWeb(doc, url) {
  6383.     var namespace = doc.documentElement.namespaceURI;
  6384.     var nsResolver = namespace ? function(prefix) {
  6385.         if (prefix == ''x'') return namespace; else return null;
  6386.     } : null;
  6387.     
  6388.     var articles = new Array();
  6389.     
  6390.     if (detectWeb(doc, url) == "multiple") {
  6391.         var items = new Object();
  6392.         
  6393.         var xPathTitles = doc.evaluate(''//td/ul'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6394.  
  6395.         var linkContent = xPathTitles.iterateNext().textContent.split(/\n/);    
  6396.         
  6397.  
  6398.         var linkContent1;
  6399.         var linkHref = new Array();
  6400.  
  6401.         var xPathLinks= doc.evaluate(''//ul/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6402.         var xPathLinksCount = doc.evaluate(''count (//ul/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6403.         
  6404.         for (i=0; i< xPathLinksCount.numberValue; i++) {
  6405.             linkHref.push(xPathLinks.iterateNext().href);
  6406.     
  6407.             var y = (i + 1);
  6408.             linkContent1 = linkContent[y].split("- ");
  6409.             
  6410.             
  6411.             items[linkHref[i]] = linkContent1[1];
  6412.         }
  6413.     
  6414.             
  6415.         items = Zotero.selectItems(items);
  6416.         for (var i in items) {
  6417.             articles.push(i);
  6418.         }
  6419.     } else {
  6420.         articles = [url];
  6421.     }
  6422.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  6423.     Zotero.wait();
  6424. }');
  6425.  
  6426.  
  6427. REPLACE INTO translators VALUES ('095239e7-c18c-4f45-a932-bcf4a9e48c08', '1.0.0b4.r5', '', '2008-08-11 20:40:00', '0', '100', '4', 'Probing the Past', 'Adam Crymble', 'http://chnm.gmu.edu/probateinventory/', 
  6428. 'function detectWeb(doc, url) {
  6429.     
  6430.     if (doc.evaluate(''//td/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  6431.         return "multiple";
  6432.     } else if (doc.location.href.match("document")) {
  6433.         return "book";
  6434.     }
  6435.     
  6436. }', 
  6437. '//Probing the Past translator; Code by Adam Crymble
  6438.  
  6439. function scrape(doc, url) {
  6440.  
  6441.     var namespace = doc.documentElement.namespaceURI;
  6442.     var nsResolver = namespace ? function(prefix) {
  6443.         if (prefix == ''x'') return namespace; else return null;
  6444.     } : null;    
  6445.     
  6446.     var dataTags = new Object();
  6447.     
  6448.     var newItem = new Zotero.Item("book");
  6449.  
  6450.     var title = doc.evaluate(''//h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6451.     
  6452.     var author = title.split(", ");
  6453.     author = author[1] + " " + author[0];
  6454.     newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  6455.  
  6456.     newItem.title = "Probate of " + author;
  6457.  
  6458.     var citation = doc.evaluate(''//table[@id="browseinfo"]'', doc,  nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6459.     
  6460.     var citation = citation.split(": ");
  6461.     citation[1] = citation[1].replace("County/City", '''');
  6462.     
  6463.     
  6464.     citation[2] = citation[2].replace("State", '''');
  6465.     for (var i = 0; i < citation.length; i++) {
  6466.         citation[i] = citation[i].replace(/^\s*|\s*$/g, '''');
  6467.     }
  6468.     Zotero.debug(citation);
  6469.  
  6470.     newItem.date = citation[1];
  6471.     newItem.place = citation[2] + ", " + citation[3];
  6472.  
  6473.     newItem.url = doc.location.href;
  6474.  
  6475.     newItem.complete();
  6476. }
  6477.  
  6478. function doWeb(doc, url) {
  6479.     var namespace = doc.documentElement.namespaceURI;
  6480.     var nsResolver = namespace ? function(prefix) {
  6481.         if (prefix == ''x'') return namespace; else return null;
  6482.     } : null;
  6483.     
  6484.     var articles = new Array();
  6485.     
  6486.     if (detectWeb(doc, url) == "multiple") {
  6487.         var items = new Object();
  6488.  
  6489.         var titles = doc.evaluate(''//td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6490.         var titlesCount = doc.evaluate(''count (//td/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6491.         
  6492.         var next_date;
  6493.         var next_title;
  6494.         var next_town;
  6495.         
  6496.         for (var i = 0; i < titlesCount.numberValue/3; i++) {
  6497.         
  6498.             next_date = titles.iterateNext();
  6499.             next_title = titles.iterateNext();
  6500.  
  6501.             items[next_title.href] = next_title.textContent;
  6502.             
  6503.             next_town = titles.iterateNext();
  6504.         }
  6505.         
  6506.         items = Zotero.selectItems(items);
  6507.         for (var i in items) {
  6508.             articles.push(i);
  6509.         }
  6510.     } else {
  6511.         articles = [url];
  6512.     }
  6513.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  6514.     Zotero.wait();
  6515. }');
  6516.  
  6517.  
  6518. REPLACE INTO translators VALUES ('d770e7d2-106c-4396-8c32-b35cdc46376c', '1.0.0b4.r5', '', '2008-08-11 20:40:00', '0', '100', '0', 'Project Gutenberg', 'Adam Crymble', 'http://www.gutenberg.org', 
  6519. 'function detectWeb(doc, url) {
  6520.     if (doc.location.href.match("etext")||doc.location.href.match("ebooks")) {
  6521.         return "book";
  6522.     } else if (doc.location.href.match("catalog")) {
  6523.         return "multiple";
  6524.     }
  6525. }', 
  6526. '//Project Gutenberg translator. Code by Adam Crymble.
  6527.  
  6528. function associateData (newItem, dataTags, field, zoteroField) {
  6529.     if (dataTags[field]) {
  6530.         newItem[zoteroField] = dataTags[field];
  6531.     }
  6532. }
  6533.  
  6534. function scrape(doc, url) {
  6535.  
  6536.     var namespace = doc.documentElement.namespaceURI;
  6537.     var nsResolver = namespace ? function(prefix) {
  6538.         if (prefix == ''x'') return namespace; else return null;
  6539.     } : null;    
  6540.     
  6541.     var dataTags = new Object();
  6542.     var odd = "yes";
  6543.     var creatorType = new Array();
  6544.     var creatorField = new Array();
  6545.     var creatorContent = new Array();
  6546.     
  6547.     var newItem = new Zotero.Item("book");
  6548.  
  6549.     var headingsEven = doc.evaluate(''//tr[@class="oddrow"]/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6550.     var headingsEvenCount = doc.evaluate(''count(//tr[@class="oddrow"]/th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6551.     
  6552.     var headingsOdd = doc.evaluate(''//tr[@class="evenrow"]/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6553.     var headingsOddCount = doc.evaluate(''count(//tr[@class="evenrow"]/th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6554.     
  6555.     var content = doc.evaluate(''//div[@class="pgdbdata"]/table/tbody//td'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6556.     
  6557.     for (var i = 0; i < headingsEvenCount.numberValue + headingsOddCount.numberValue; i++) {
  6558.         if (odd == "yes") {
  6559.             fieldTitle = headingsOdd.iterateNext().textContent.replace(/\s+/g, '''');
  6560.             odd = "no";
  6561.         } else {
  6562.             fieldTitle = headingsEven.iterateNext().textContent.replace(/\s+/g, '''');
  6563.             odd = "yes";
  6564.         }
  6565.         dataTags[fieldTitle] = Zotero.Utilities.cleanTags(content.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  6566.         
  6567.         if (fieldTitle == "Creator") {
  6568.             
  6569.             creatorType.push("author");
  6570.             creatorField.push("Creator");
  6571.             creatorContent.push(dataTags[fieldTitle]);
  6572.             
  6573.         } else if (fieldTitle == "Illustrator") {
  6574.             
  6575.             creatorType.push("illustrator");
  6576.             creatorField.push("Illustrator");
  6577.             creatorContent.push(dataTags[fieldTitle]);
  6578.             
  6579.         }else if (fieldTitle == "Translator") {
  6580.             
  6581.             creatorType.push("translator");
  6582.             creatorField.push("Translator");
  6583.             creatorContent.push(dataTags[fieldTitle]);
  6584.             
  6585.         } else if (fieldTitle == "Editor") {
  6586.             
  6587.             creatorType.push("editor");
  6588.             creatorField.push("Editor");
  6589.             creatorContent.push(dataTags[fieldTitle]);
  6590.             
  6591.         } else if (fieldTitle == "Commentator") {
  6592.             
  6593.             creatorType.push("commentator");
  6594.             creatorField.push("Commentator");
  6595.             creatorContent.push(dataTags[fieldTitle]);
  6596.             
  6597.         } else if (fieldTitle == "Contributor") {
  6598.             
  6599.             creatorType.push("contributor");
  6600.             creatorField.push("Contributor");
  6601.             creatorContent.push(dataTags[fieldTitle]);
  6602.         }
  6603.         if (fieldTitle == "Imprint") {
  6604.             var place = dataTags["Imprint"].split(":");
  6605.             newItem.place = place[0];
  6606.             Zotero.debug(place);
  6607.         }
  6608.         
  6609.          if (fieldTitle == "Subject") {
  6610.             newItem.tags[i] = dataTags["Subject"];
  6611.         }
  6612.     }
  6613.  
  6614.     for (var i = 0; i < creatorType.length; i++) {
  6615.         if (creatorContent[i].match(", ")) {
  6616.             
  6617.             var author = creatorContent[i].split(", ");
  6618.             var author = author[1] + " " + author[0];
  6619.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, creatorType[i]));
  6620.         } else {
  6621.     
  6622.             newItem.creators.push(Zotero.Utilities.cleanAuthor(creatorContent[i], creatorType[i]));
  6623.         }
  6624.     }
  6625.     
  6626.     
  6627.     if (dataTags["EText-No."]) {
  6628.         newItem.callNumber = "EText-No. " + dataTags["EText-No."];
  6629.     }
  6630.     
  6631.     if (dataTags["ReleaseDate"]) {
  6632.         newItem.date = "Release Date " + dataTags["ReleaseDate"];
  6633.     }
  6634.     
  6635.     if (dataTags["LoCClass"]) {
  6636.         newItem.extra = "LoC Class " + dataTags["LoCClass"];
  6637.     }
  6638.  
  6639.     associateData (newItem, dataTags, "Title", "title");    
  6640.     associateData (newItem, dataTags, "Language", "language");
  6641.     associateData (newItem, dataTags, "CopyrightStatus", "rights");
  6642.     
  6643.     newItem.url = doc.location.href;
  6644.  
  6645.     newItem.complete();
  6646. }
  6647.  
  6648. function doWeb(doc, url) {
  6649.     var namespace = doc.documentElement.namespaceURI;
  6650.     var nsResolver = namespace ? function(prefix) {
  6651.         if (prefix == ''x'') return namespace; else return null;
  6652.     } : null;
  6653.     
  6654.     var articles = new Array();
  6655.     
  6656.     if (detectWeb(doc, url) == "multiple") {
  6657.         var items = new Object();
  6658.         
  6659.         var allLinks = doc.evaluate(''//td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6660.         var xPathCount = doc.evaluate(''count(//td/a)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6661.         
  6662.         var next_title;
  6663.         for (var i = 0; i < xPathCount.numberValue; i++) {
  6664.             next_title = allLinks.iterateNext();
  6665.             if (next_title.href.match("etext")) {
  6666.                 items[next_title.href] = next_title.textContent;
  6667.             }
  6668.         }
  6669.         
  6670.         items = Zotero.selectItems(items);
  6671.         for (var i in items) {
  6672.             articles.push(i);
  6673.         }
  6674.     } else {
  6675.         articles = [url];
  6676.     }
  6677.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  6678.     Zotero.wait();
  6679. }');
  6680.  
  6681.  
  6682. REPLACE INTO translators VALUES ('40b9ca22-8df4-4f3b-9cb6-8f9b55486d30', '1.0.0b4.r5', '', '2009-01-09 21:10:00', 1, 100, 4, 'Telegraph.co.uk', 'Reino Ruusu', '^http://www\.telegraph\.co\.uk/',
  6683. 'function detectWeb(doc, url) {
  6684.     Zotero.debug("detectWeb URL= "+ url);
  6685.     var result = doc.evaluate(''html/head/meta[@name = "article-id"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  6686.     if (result) {
  6687.         return "newspaperArticle";
  6688.     }
  6689.     return null;
  6690. }',
  6691. 'function getAuthors(byline) {
  6692.     if (byline.search(/.+(?:,\s.+)+\sand\s.+/) == -1) {
  6693.         byline = byline.replace(/,\s.+$/, "");
  6694.     }
  6695.     byline = byline.replace(/\s+(?:in|at)\s+.+$/, "");
  6696.     return byline.split(/(?:,\s+|\s+and\s+)/);
  6697. }
  6698.  
  6699. function putAuthors(item, byline) {
  6700.     for each (var a in getAuthors(byline)) {
  6701.         item.creators.push(Zotero.Utilities.cleanAuthor(a, "author"));
  6702.     }
  6703. }
  6704.  
  6705. function doWeb(doc, url) {
  6706.     Zotero.debug("doWeb URL= "+ url);
  6707.     var newArticle = new Zotero.Item(''newspaperArticle'');
  6708.     newArticle.url = url;
  6709.     newArticle.publicationTitle = ''Telegraph.co.uk'';
  6710.     //newArticle.publisher = ''Telegraph Media Group Limited'';
  6711.     //Zotero.debug(doc.evaluate(''//html/head/meta[@name="title"]/@content'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  6712.     var metaElements = doc.evaluate(''html/head/meta'', doc, null, XPathResult.ANY_TYPE, null);
  6713.     var tmp;    
  6714.     while (tmp = metaElements.iterateNext()) {
  6715.         var name = tmp.getAttribute(''name'');
  6716.         var content = tmp.getAttribute(''content'');
  6717.         if (name == ''title'')
  6718.             newArticle.title = content;
  6719.             else if (name == ''author'') {
  6720.                 content = Zotero.Utilities.trim(content);
  6721.                 //Zotero.debug(content);
  6722.                 content = content.replace(/^By\s+/, "");
  6723.                 putAuthors(newArticle, content);
  6724.             }
  6725.             else if (name == ''description'') {
  6726.                 newArticle.abstractNote = content.replace(/\s+/gm, " ");
  6727.             }
  6728.     }
  6729.     
  6730.     var datePath = ''//div[@class="story"]/div[@class="byline"]/p[1]/br/following-sibling::text()'';
  6731.     var dateElement = doc.evaluate(datePath, doc, null,XPathResult.ANY_TYPE, null).iterateNext();
  6732.     if (dateElement) {
  6733.         var dateRE = /\d\d?\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d\d\d\d/;
  6734.         var date = dateElement.textContent.match(dateRE);
  6735.         if (date) newArticle.date = date[0];
  6736.     }
  6737.     newArticle.complete();
  6738. }');
  6739.  
  6740.  
  6741. REPLACE INTO translators VALUES ('6b0b11a6-9b77-4b49-b768-6b715792aa37', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'Toronto Star', 'Adam Crymble', 'http://www.thestar.com', 
  6742. 'function detectWeb(doc, url) {
  6743.     if (doc.location.href.match("search") && !doc.location.href.match("classifieds")) {
  6744.         return "multiple";
  6745.     } else if (doc.location.href.match("article")) {
  6746.         return "newspaperArticle";
  6747.     }
  6748. }', 
  6749. '//Toronto Star translator. code by Adam Crymble
  6750.  
  6751. function scrape(doc, url) {
  6752.  
  6753.     var namespace = doc.documentElement.namespaceURI;
  6754.     var nsResolver = namespace ? function(prefix) {
  6755.         if (prefix == ''x'') return namespace; else return null;
  6756.     } : null;    
  6757.     
  6758.     var newItem = new Zotero.Item("newspaperArticle");
  6759.  
  6760.     if (doc.title.match("TheStar.com | ")) {
  6761.         var lineBreak = doc.title.lastIndexOf(" |");
  6762.         newItem.section = doc.title.substr(14, lineBreak-14);
  6763.     }
  6764.     
  6765.     var byLine = doc.evaluate(''//div[@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article"]/div/span'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6766.     
  6767.     var nextEntry;
  6768.     while (nextEntry = byLine.iterateNext()) {
  6769.         if (nextEntry.textContent.match(" PM") || nextEntry.textContent.match(" AM") && nextEntry.textContent.match(/\d\d\d\d/)) {
  6770.             newItem.date = nextEntry.textContent;
  6771.         } else {
  6772.             newItem.abstractNote = nextEntry.textContent;
  6773.         }
  6774.     }
  6775.          
  6776.     var author1 = new Array();
  6777.          var k = 0;
  6778.          
  6779.          if (doc.evaluate(''//span[@class="articleAuthor"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6780.              var author = doc.evaluate(xPathAuthor, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6781.              var authorName;
  6782.              
  6783.              while (authorName = author.iterateNext()) {
  6784.             author1.push(authorName.textContent);    
  6785.             k++;
  6786.              }
  6787.  
  6788.              if (k>1) {
  6789.             for (k in author1) {
  6790.                 var words = author1[k].toLowerCase().split(/\s/);
  6791.                 
  6792.                 for (var i in words) {
  6793.                     words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  6794.                 }
  6795.                 
  6796.                 author1[k] = words.join(" ");
  6797.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author"));    
  6798.                 }     
  6799.              } else {
  6800.  
  6801.                  var words = author1[0].toLowerCase().split(/\s/);
  6802.             for (var i in words) {
  6803.                 words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  6804.             }
  6805.             author1[0] = words.join(" ");
  6806.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[0], "author"));    
  6807.              }
  6808.          }
  6809.  
  6810.     var xPathTitle = ''//span[@class="headlineArticle"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Title__"]'';
  6811.     newItem.title = doc.evaluate(xPathTitle, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;    
  6812.     
  6813.     newItem.url = doc.location.href;
  6814.     newItem.publicationTitle = "The Toronto Star";
  6815.     newItem.ISSN = "0319-0781";
  6816.  
  6817.     newItem.complete();
  6818. }
  6819.  
  6820. function doWeb(doc, url) {
  6821.     var namespace = doc.documentElement.namespaceURI;
  6822.     var nsResolver = namespace ? function(prefix) {
  6823.         if (prefix == ''x'') return namespace; else return null;
  6824.     } : null;
  6825.     
  6826.     var articles = new Array();
  6827.     
  6828.     if (detectWeb(doc, url) == "multiple") {
  6829.         var items = new Object();
  6830.         
  6831.         var titles = doc.evaluate(''//a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6832.         
  6833.         var next_title;
  6834.         while (next_title = titles.iterateNext()) {
  6835.             if (next_title.href.match("http://www.thestar.com") && next_title.href.match("article") && !next_title.href.match("generic") && !next_title.href.match("static")) {
  6836.                 items[next_title.href] = next_title.textContent;
  6837.             }
  6838.         }
  6839.         items = Zotero.selectItems(items);
  6840.         for (var i in items) {
  6841.             articles.push(i);
  6842.         }
  6843.     } else {
  6844.         articles = [url];
  6845.     }
  6846.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  6847.     Zotero.wait();
  6848. }');
  6849.  
  6850.  
  6851. REPLACE INTO translators VALUES ('35d6c82d-4749-4cc5-9e12-2924307df28f', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'UBC Library Catalog', 'Adam Crymble', 'http://webcat(1||2).library.ubc', 
  6852. 'function detectWeb(doc, url) {
  6853.     
  6854.     if (doc.evaluate(''//tbody/tr/td[1]/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  6855.         return "multiple";
  6856.     } else if (doc.evaluate(''//center/h4/i/strong/bdo'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  6857.         return "book";
  6858.     }
  6859. }', 
  6860. '//UBC Library Catalog translator. Code by Adam Crymble
  6861.  
  6862. function associateData (newItem, dataTags, field, zoteroField) {
  6863.     if (dataTags[field]) {
  6864.         newItem[zoteroField] = dataTags[field];
  6865.     }
  6866. }
  6867.  
  6868. function scrape(doc, url) {
  6869.  
  6870.     var namespace = doc.documentElement.namespaceURI;
  6871.     var nsResolver = namespace ? function(prefix) {
  6872.         if (prefix == ''x'') return namespace; else return null;
  6873.     } : null;    
  6874.     
  6875.     var dataTags = new Object();
  6876.     var tagsContent = new Array();
  6877.     var headersArray = new Array();
  6878.     var fieldTitle;
  6879.     
  6880.     var newItem = new Zotero.Item("book");
  6881.  
  6882.     var headers = doc.evaluate(''//form/table/tbody/tr/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6883.     var xPathCount= doc.evaluate(''count (//form/table/tbody/tr/th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6884.     
  6885.     var contents = doc.evaluate(''//form/table'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6886.     var dump = contents.iterateNext();
  6887.     
  6888.     
  6889.     for (var i = 0; i < xPathCount.numberValue; i++) {
  6890.         fieldTitle = headers.iterateNext().textContent;
  6891.         if (fieldTitle.match(/\w/)) {
  6892.             headersArray.push(fieldTitle);
  6893.         }
  6894.     }
  6895.     
  6896.     var contentsArray = new Array();
  6897.     var j = 0;
  6898.     contents = contents.iterateNext().textContent.replace(/\s\s/g, '''');
  6899.     
  6900.     for (var i = headersArray.length-1; i> -1; i--) {         
  6901.         
  6902.         var fieldIndex = contents.lastIndexOf(headersArray[i]);
  6903.  
  6904.         var headerLength = headersArray[i].length;
  6905.         
  6906.         contentsArray.push(contents.substr(fieldIndex+headerLength));
  6907.         contents = contents.substr(0, fieldIndex);
  6908.     
  6909.         fieldTitle = headersArray[i].replace(/\s+/g, '''');
  6910.         if (fieldTitle == "Subject(s):") {
  6911.             if (contentsArray[j].match(". ")) {
  6912.                 var tagsContent = contentsArray[j].split(". ")
  6913.             } else if (contentsArray[j].match(/\n/)) {
  6914.                 var tagsContent = contentsArray[j].split(/\n/);
  6915.             } else {
  6916.                 newItem.tags = contentsArray[j];
  6917.                 var noMoreTags = 1;
  6918.             }
  6919.                 
  6920.         }
  6921.         dataTags[fieldTitle] = contentsArray[j].replace(/^\s*|\s+$/g, '''');
  6922.         
  6923.         j++;
  6924.     }    
  6925.     
  6926.     j = 0;
  6927.     
  6928.     if (noMoreTags != 1) {
  6929.         for (var i = 0; i < tagsContent.length; i++) {
  6930.                  if (tagsContent[i].match(/\w/)) {
  6931.                      newItem.tags[j] = tagsContent[i].replace(/^\s*|\s+$/g, '''');
  6932.                      j++;
  6933.                  }
  6934.              }
  6935.     }
  6936.         
  6937.     if (dataTags["MainAuthor:"]) {
  6938.         var author = dataTags["MainAuthor:"];
  6939.         if (author.match(", ")) {
  6940.             var authors = author.split(", ");
  6941.             author = authors[1] + " " + authors[0];
  6942.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  6943.         } else {
  6944.             newItem.creators.push({lastName: author, creatorType: "creator"});                
  6945.         }
  6946.     }
  6947.     
  6948.     if (dataTags["OtherAuthor(s):"]) {
  6949.         var author = dataTags["OtherAuthor(s):"];
  6950.         
  6951.         if (author.match(", ")) {
  6952.             var authors = author.split(", ");
  6953.             author = authors[1] + " " + authors[0];
  6954.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  6955.         } else {
  6956.             newItem.creators.push({lastName: author, creatorType: "creator"});                
  6957.         }
  6958.     }
  6959.     
  6960.     if (dataTags["Published:"]) {
  6961.         if (dataTags["Published:"].match(": ")) {
  6962.             var imprint = dataTags["Published:"];
  6963.             
  6964.             var place1 = imprint.indexOf(": ");
  6965.             
  6966.             newItem.place = imprint.substr(0, place1);
  6967.             
  6968.             var imprint2 = imprint.substr(place1+2);
  6969.             
  6970.             if (imprint2.match(/\d\d\d/)) {
  6971.                 var date1 = imprint2.lastIndexOf(/\d\d\d/);
  6972.                 var date2 = imprint2.substr(date1-4);
  6973.                 newItem.date = date2;
  6974.                 newItem.publisher = imprint2.substr(0, imprint2.length-(newItem.date.length+2));
  6975.             } else {
  6976.                 newItem.publisher = imprint2;
  6977.             }
  6978.         } else {
  6979.             newItem.publisher = dataTags["Published:"]
  6980.         }
  6981.     }
  6982.     
  6983.     associateData (newItem, dataTags, "Title:", "title");
  6984.     associateData (newItem, dataTags, "CallNumber:", "callNumber");
  6985.     associateData (newItem, dataTags, "Description:", "pages");
  6986.     associateData (newItem, dataTags, "Location:", "repository");
  6987.  
  6988.     newItem.url = doc.location.href;
  6989.  
  6990.     newItem.complete();
  6991. }
  6992.  
  6993. function doWeb(doc, url) {
  6994.     var namespace = doc.documentElement.namespaceURI;
  6995.     var nsResolver = namespace ? function(prefix) {
  6996.         if (prefix == ''x'') return namespace; else return null;
  6997.     } : null;
  6998.     
  6999.     var articles = new Array();
  7000.     
  7001.     if (detectWeb(doc, url) == "multiple") {
  7002.         var items = new Object();
  7003.         
  7004.         var titles = doc.evaluate(''//form/table/tbody/tr/td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7005.                 
  7006.         var next_title;
  7007.         while (next_title = titles.iterateNext()) {
  7008.             items[next_title.href] = next_title.textContent;
  7009.         }
  7010.         items = Zotero.selectItems(items);
  7011.         for (var i in items) {
  7012.             articles.push(i);
  7013.         }
  7014.     } else {
  7015.         articles = [url];
  7016.     }
  7017.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7018.     Zotero.wait();
  7019. }');
  7020.  
  7021.  
  7022. REPLACE INTO translators VALUES ('f8b5501a-1acc-4ffa-a0a5-594add5e6bd3', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'US National Archives Research Catalog', 'Adam Crymble', 'http://arcweb.archives.gov', 
  7023. 'function detectWeb(doc, url) {
  7024.     if (doc.location.href.match("ShowArchivalDescriptions") || doc.location.href.match("ShowDODescriptions")) {
  7025.         return "multiple";
  7026.     } else if (doc.location.href.match("ShowFullRecord") && doc.location.href.match("showFullDescriptionTabs/details")) {
  7027.         return "book";
  7028.     }
  7029. }', 
  7030. '//US National Archives. Code by Adam Crymble
  7031.  
  7032. function associateData (newItem, dataTags, field, zoteroField) {
  7033.     if (dataTags[field]) {
  7034.         newItem[zoteroField] = dataTags[field];
  7035.     }
  7036. }
  7037.  
  7038. function scrape(doc, url) {
  7039.  
  7040.     var namespace = doc.documentElement.namespaceURI;
  7041.     var nsResolver = namespace ? function(prefix) {
  7042.         if (prefix == ''x'') return namespace; else return null;
  7043.     } : null;    
  7044.     
  7045.     var dataTags = new Object();
  7046.     var fieldTitle;
  7047.     
  7048.     var newItem = new Zotero.Item("book");
  7049.     
  7050.     var contents2 = doc.evaluate(''//td[1]/div[@class="sT"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7051.  
  7052.     for (var i = 0; i < 3; i++) {
  7053.         if (i == 0) {
  7054.             newItem.title = contents2.iterateNext().textContent.replace(/^\s*|\s+$/g, '''');
  7055.         } else if (i == 1) {
  7056.             newItem.extra = contents2.iterateNext().textContent.replace(/^\s*|\s+$/g, '''');
  7057.         } else if (i == 2) {
  7058.             newItem.locInArchive= contents2.iterateNext().textContent.replace(/^\s*|\s+$/g, '''');
  7059.         }                
  7060.     }
  7061.     
  7062.     var headers = doc.evaluate(''//tbody/tr/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7063.     var contents = doc.evaluate(''//body/div[@class="genPad"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7064.  
  7065.     var xPathCount = doc.evaluate(''count (//tbody/tr/th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7066.     
  7067.     var headersArray = new Array();
  7068.     var oneHeader = '''';
  7069.  
  7070.     if (xPathCount.numberValue > 1) {
  7071.         for (var i = 0; i < xPathCount.numberValue; i++) {
  7072.             fieldTitle = headers.iterateNext().textContent;
  7073.             headersArray.push(fieldTitle);
  7074.         }
  7075.     } else {
  7076.         oneHeader = (headers.iterateNext().textContent);
  7077.     }
  7078.     
  7079.     var contentsArray = new Array();
  7080.     var j = 0;
  7081.     
  7082.     if (oneHeader.length<1) {
  7083.     
  7084.         for (var i = headersArray.length-1; i> -1; i--) {         
  7085.         
  7086.             var fieldIndex = contents.lastIndexOf(headersArray[i]);
  7087.             var fieldIndexLength = headersArray[i].length;
  7088.             
  7089.             contentsArray.push(contents.substr(fieldIndex));
  7090.             contents = contents.substr(0, fieldIndex);
  7091.             fieldTitle = headersArray[i].replace(/\s+/g, '''');
  7092.             
  7093.             dataTags[fieldTitle] = contentsArray[j].substr(fieldIndexLength).replace(/^\s*|\s+$/g, '''');
  7094.             
  7095.             j++;
  7096.         }
  7097.     }
  7098.     j = 0;
  7099.     var k = 0;
  7100.     var tagsContent = new Array();
  7101.     
  7102.     if (dataTags["IndexTerms:"]) {
  7103.         if (dataTags["IndexTerms:"].match(/\n/)){
  7104.             var tagsContent = dataTags["IndexTerms:"].split(/\n/);
  7105.         } else {
  7106.             if (!dataTags["IndexTerms:"].match("Subjects Represented in the Archival Material")) {
  7107.                 newItem.tags = dataTags["IndexTerms:"];
  7108.             }
  7109.         }
  7110.         if (tagsContent.length > 1) {
  7111.             for (var i = 0; i < tagsContent.length; i++) {
  7112.                      if (tagsContent[i].match(/\w/)) {
  7113.                          if (k == 1) {
  7114.                              newItem.tags[j] = tagsContent[i];
  7115.                              j++;
  7116.                          }
  7117.                          k = 1;
  7118.                      }
  7119.                  }
  7120.         }
  7121.     }
  7122.  
  7123.     associateData (newItem, dataTags, "ProductionDate(s):", "date");
  7124.     associateData (newItem, dataTags, "PartOf:", "series");
  7125.     associateData (newItem, dataTags, "VariantControlNumber(s):", "callNumber");
  7126.     
  7127.     if (dataTags["Creator(s):"]) {
  7128.         var author = dataTags["Creator(s):"];
  7129.         if (author.match(", ")) {
  7130.             var authors = author.split(", ");
  7131.             author = authors[1] + " " + authors[0];
  7132.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  7133.         } else {
  7134.             newItem.creators.push({lastName: author, creatorType: "creator"});            
  7135.         }
  7136.     }
  7137.     
  7138.     newItem.url = doc.location.href;
  7139.     newItem.complete();
  7140. }
  7141.  
  7142. function doWeb(doc, url) {
  7143.     var namespace = doc.documentElement.namespaceURI;
  7144.     var nsResolver = namespace ? function(prefix) {
  7145.         if (prefix == ''x'') return namespace; else return null;
  7146.     } : null;
  7147.     
  7148.     var articles = new Array();
  7149.     
  7150.     if (detectWeb(doc, url) == "multiple") {
  7151.         var items = new Object();
  7152.             
  7153.         if (doc.evaluate(''//div[@class="sT"]/p/strong[@class="sFC"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7154.             var titles = doc.evaluate(''//div[@class="sT"]/p/strong[@class="sFC"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7155.             
  7156.         } else if (doc.evaluate(''//td[3]/div[@class="sT"]/p/strong[@class="sFC"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7157.             var titles = doc.evaluate(''//td[3]/div[@class="sT"]/p/strong[@class="sFC"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7158.             
  7159.         }    
  7160.         
  7161.         
  7162.  
  7163.         var next_title;
  7164.         while (next_title = titles.iterateNext()) {
  7165.             items[next_title.href] = next_title.textContent;
  7166.         }
  7167.         items = Zotero.selectItems(items);
  7168.         for (var i in items) {
  7169.             articles.push(i);
  7170.         }
  7171.     } else {
  7172.         articles = [url];
  7173.     }
  7174.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7175.     Zotero.wait();
  7176. }');
  7177.  
  7178.  
  7179. REPLACE INTO translators VALUES ('1d82cbdf-703d-4f96-9ae2-246af21bb96e', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'Winnipeg Free Press', 'Adam Crymble', 'http://www.winnipegfreepress', 
  7180. 'function detectWeb(doc, url) {
  7181.     if (doc.location.href.match("articles") || doc.location.href.match("story")) {
  7182.         return "newspaperArticle";
  7183.     }
  7184. }', 
  7185. '//Winnipeg Free Press Translator. Code by Adam Crymble
  7186. //works for single entries only.
  7187.  
  7188. function scrape(doc, url) {
  7189.  
  7190.     var namespace = doc.documentElement.namespaceURI;
  7191.     var nsResolver = namespace ? function(prefix) {
  7192.         if (prefix == ''x'') return namespace; else return null;
  7193.     } : null;    
  7194.     
  7195.     var newItem = new Zotero.Item("newspaperArticle");
  7196.  
  7197.     newItem.title = doc.evaluate(''//h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  7198.  
  7199.     if (doc.evaluate(''//div[@id="middlecol"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7200.         newItem.abstractNote = doc.evaluate(''//div[@id="middlecol"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  7201.     }
  7202.  
  7203.     if (doc.evaluate(''//div[@id="bylines"]/p[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7204.         var byline = doc.evaluate(''//p[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7205.         
  7206.         var k = 0;
  7207.         var byLineArray = new Array();
  7208.         var nextByLine;
  7209.         
  7210.         while (nextByLine = byline.iterateNext()) {
  7211.             byLineArray.push(nextByLine.textContent.replace(/^\s*|\s*$/g, ''''));
  7212.             k++;
  7213.         }    
  7214.         
  7215.         if (k>1) {
  7216.             for (var i = 0; i < byLineArray.length; i++) {
  7217.                 if (byLineArray[i].match("Updated:")) {
  7218.                     newItem.date = byLineArray[i].substr(9).replace(/^\s*|\s*$/g, '''');
  7219.                 } else if (byLineArray[i].match("bylineParse") && byLineArray[i].substr(13).match(/\w/)) {
  7220.                 
  7221.                     var author = (byLineArray[i].substr(13));
  7222.                     var authorLength = author.length/2;
  7223.                     var author = author.substr(0 + authorLength);
  7224.                     var m = 0;
  7225.                     
  7226.                     if (author.match(" - ")) {
  7227.                         var author = author.split('' - '');
  7228.                     } else if (author.match(", ")) {
  7229.                         var author = author.split('', '');
  7230.                     } else if (author.match(/ By /)) {
  7231.                         var author = author.split(/By/);
  7232.                         author[0] = author[1];
  7233.                     } else if (author.match(/By:/)) {
  7234.                         var author = author.split(/By:/);
  7235.                         author[0] = author[1];
  7236.                     } else {
  7237.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  7238.                         m = 1;
  7239.                     }
  7240.                     
  7241.                     if (m == 0) {
  7242.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(author[0], "author"));    
  7243.                     }                    
  7244.                 }
  7245.             }
  7246.         }
  7247.     }
  7248.              
  7249.     newItem.publicationTitle = "Winnipeg Free Press";
  7250.     newItem.url = doc.location.href;
  7251.     newItem.complete();
  7252. }
  7253.  
  7254. function doWeb (doc, url) {
  7255.     var namespace = doc.documentElement.namespaceURI;
  7256.     var nsResolver = namespace ? function(prefix) {
  7257.     }: null;
  7258.     
  7259.     var uris= new Array();
  7260.     uris.push(url);
  7261.     Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();});
  7262.     Zotero.wait();
  7263. }');
  7264.  
  7265.  
  7266. REPLACE INTO translators VALUES ('dbfcaa3e-082a-45a4-9619-9892f49399c1', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'Cyberpresse', 'Adam Crymble', 'http://www.cyberpresse.ca', 
  7267. 'function detectWeb (doc,  url) {
  7268.     if (doc.location.href.match("article")) {
  7269.         return "newspaperArticle";
  7270.     }
  7271. }', 
  7272. '//Cyberpresse translator. Code by Adam Crymble
  7273.  
  7274. function associateData (newItem, dataTags, field, zoteroField) {
  7275.     if (dataTags[field]) {
  7276.         newItem[zoteroField] = dataTags[field];
  7277.     }
  7278. }
  7279.  
  7280. function scrape(doc, url) {
  7281.  
  7282.     var namespace = doc.documentElement.namespaceURI;
  7283.     var nsResolver = namespace ? function(prefix) {
  7284.         if (prefix == ''x'') return namespace; else return null;
  7285.     } : null;    
  7286.     
  7287.     var dataTags = new Object();
  7288.     var tagsContent = new Array();
  7289.     var fieldTitle;
  7290.     
  7291.     var newItem = new Zotero.Item("newspaperArticle");
  7292.     
  7293.     if (doc.title.match("|")) {
  7294.     
  7295.         var titleStuff = doc.title.split("|");    
  7296.         if (titleStuff[0].match(":")) {
  7297.             var authorTitle  = titleStuff[0].split(":");
  7298.             newItem.title = authorTitle[1];
  7299.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authorTitle[0], "author"));    
  7300.             
  7301.         } else {
  7302.             newItem.title = titleStuff[0];
  7303.         }
  7304.         
  7305.     } else {
  7306.         newItem.title = doc.title;
  7307.     }
  7308.  
  7309.     var dataTagHTML = doc.getElementsByTagName("meta");
  7310.     for (var i = 0 ; i < dataTagHTML.length ; i++) {
  7311.         dataTags[dataTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(dataTagHTML[i].getAttribute("content"));
  7312.     }
  7313.  
  7314.     if (doc.evaluate(''//div[@id="nouvelle"]/p[@class="auteur"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7315.         var author = doc.evaluate(''//div[@id="nouvelle"]/p[@class="auteur"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7316.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  7317.     }        
  7318.     
  7319.     if (doc.evaluate(''//div[@id="nouvelle"]/p[@class="date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7320.         newItem.date = doc.evaluate(''//div[@id="nouvelle"]/p[@class="date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;    
  7321.     }        
  7322.     
  7323.     associateData (newItem, dataTags, "summary", "abstractNote");
  7324.     associateData (newItem, dataTags, "mediaarticle", "publicationTitle");
  7325.  
  7326.     newItem.url = doc.location.href;
  7327.  
  7328.     newItem.complete();
  7329. }
  7330.  
  7331. function doWeb(doc, url) {
  7332.     
  7333.     var articles = new Array();
  7334.     
  7335.     articles = [url];
  7336.     
  7337.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7338.     Zotero.wait();    
  7339. }');
  7340.  
  7341.  
  7342. REPLACE INTO translators VALUES ('1eb5eb03-26ab-4015-bd0d-65487734744a', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'Bibliotheque et Archives Nationale du Quebec (Pistard)', 'Adam Crymble', 'http://pistard.banq.qc.ca', 
  7343. 'function detectWeb (doc, url) {
  7344.     
  7345.     if (doc.title.match("Liste d├⌐taill├⌐e des fonds")) {
  7346.         return "multiple";
  7347.     } else if (doc.title.match("Description fonds")) {
  7348.         return "book";
  7349.     }
  7350. }', 
  7351. '//Bibliotheque et Archives National du Quebec. Code by Adam Crymble
  7352.  
  7353. function associateData (newItem, dataTags, field, zoteroField) {
  7354.     if (dataTags[field]) {
  7355.         newItem[zoteroField] = dataTags[field];
  7356.     }
  7357. }
  7358.  
  7359. function scrape(doc, url) {
  7360.     var namespace = doc.documentElement.namespaceURI;
  7361.     var nsResolver = namespace ? function(prefix) {
  7362.         if (prefix == ''x'') return namespace; else return null;
  7363.     } : null;
  7364.     
  7365.     var dataTags = new Object();
  7366.     var fieldTitle;
  7367.     var tagsContent= new Array();
  7368.  
  7369.     var newItem = new Zotero.Item("book");
  7370.     
  7371.          var headers = doc.evaluate(''//strong'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7372.          var xPathCount = doc.evaluate(''count (//strong)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7373.          var contents = doc.evaluate(''//div[@id="Content"]/div/table'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7374.          
  7375.          var headersArray = new Array();
  7376.     var oneHeader = '''';
  7377.  
  7378.     if (xPathCount.numberValue > 1) {
  7379.         for (var i = 0; i < xPathCount.numberValue; i++) {
  7380.             fieldTitle = headers.iterateNext().textContent;
  7381.             headersArray.push(fieldTitle);
  7382.         }
  7383.     } else {
  7384.         oneHeader = (headers.iterateNext().textContent);
  7385.     }
  7386.     
  7387.     var contentsArray = new Array();
  7388.     var j = 0;
  7389.     
  7390.     if (oneHeader.length<1) {
  7391.     
  7392.         for (var i = headersArray.length-1; i> -1; i--) {         
  7393.         
  7394.             var fieldIndex = contents.indexOf(headersArray[i]);
  7395.             var removeHeader = headersArray[i].length;
  7396.             
  7397.             contentsArray.push(contents.substr(fieldIndex));
  7398.             contents = contents.substr(0, fieldIndex);
  7399.             fieldTitle = headersArray[i].replace(/\s+/g, '''');
  7400.             
  7401.             dataTags[fieldTitle] = contentsArray[j].substr(removeHeader).replace(/^\s*|\s+$/g, '''');
  7402.             j++;
  7403.         }
  7404.     } 
  7405.     Zotero.debug(dataTags);
  7406.     
  7407.     if (dataTags["Titre,Dates,Quantit├⌐"]) {
  7408.         if (dataTags["Titre,Dates,Quantit├⌐"].match(/\n/)) {
  7409.             var splitTitle = dataTags["Titre,Dates,Quantit├⌐"].split(/\n/);
  7410.             if (splitTitle[0].match(/\w/)) {
  7411.                 newItem.title = splitTitle[0].replace(/^\s*|\s+$/g, '''');
  7412.             }
  7413.             for (var i = 0; i < splitTitle.length; i++) {
  7414.                 if (splitTitle[i].match("/ ")) {
  7415.                     var author = splitTitle[i].replace(/^\s*|\s+$/g, '''').substr(2);
  7416.                     newItem.creators.push({lastName: author, creatorType: "creator"});
  7417.                 }
  7418.             }
  7419.         }
  7420.     } else {
  7421.         newItem.title = doc.title;
  7422.     }
  7423.     
  7424.     
  7425.     var k = 0;
  7426.     if (dataTags["Termesrattach├⌐s"]) {
  7427.         
  7428.         if (dataTags["Termesrattach├⌐s"].match(/\n/)) {
  7429.             tagsContent = dataTags["Termesrattach├⌐s"].split(/\n/);
  7430.             for (var i in tagsContent) {
  7431.                 if (tagsContent[i].match(/\w/)) {
  7432.                     newItem.tags[k] = tagsContent[i].replace(/^\s+|\s*$/g, '''');                    
  7433.                     k++;
  7434.                 }
  7435.             }
  7436.         } else {
  7437.             newItem.tags[0] = dataTags["Termesrattach├⌐s"];
  7438.         }    
  7439.     }
  7440.     
  7441.     associateData (newItem, dataTags, "Languedesdocuments", "language");
  7442.     associateData (newItem, dataTags, "Cote:", "callNumber");
  7443.     associateData (newItem, dataTags, "Collation", "pages");
  7444.     associateData (newItem, dataTags, "Centre:", "place");
  7445.     associateData (newItem, dataTags, "Port├⌐eetcontenu", "abstractNote");
  7446.     
  7447.     newItem.url = doc.location.href;
  7448.     newItem.complete();    
  7449. }
  7450.  
  7451. function doWeb(doc, url) {
  7452.     var namespace = doc.documentElement.namespaceURI;
  7453.     var nsResolver = namespace ? function(prefix) {
  7454.         if (prefix == ''x'') return namespace; else return null;
  7455.     } : null;
  7456.     
  7457.     var articles = new Array();
  7458.     
  7459.     if (detectWeb(doc, url) == "multiple") {
  7460.         var items = new Object();
  7461.             
  7462.         var titles = doc.evaluate(''//td[2]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7463.     
  7464.         var next_title;    
  7465.         while (next_title = titles.iterateNext()) {
  7466.             if (next_title.href.match("description_fonds")) {
  7467.                 items[next_title.href] = next_title.textContent;
  7468.             }
  7469.         }
  7470.         items = Zotero.selectItems(items);
  7471.         for (var i in items) {
  7472.             articles.push(i);
  7473.         }
  7474.     } else {
  7475.         articles = [url];
  7476.     }
  7477.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7478.     Zotero.wait();
  7479. }');
  7480.  
  7481.  
  7482. REPLACE INTO translators VALUES ('04c0db88-a7fc-4d1a-9cf7-471d0990acb1', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '0', '100', '4', 'Christian Science Monitor', 'Adam Crymble', 'http://(features.csmonitor|www.csmonitor).com', 
  7483. 'function detectWeb(doc, url) {
  7484.     if (doc.location.href.match("search")) {
  7485.         return "multiple";
  7486.     } else if (doc.location.href.match("features")) {
  7487.         return "newspaperArticle";
  7488.     } else if (doc.evaluate(''//div[@id="storyContent"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  7489.         return "newspaperArticle";
  7490.     }
  7491. }', 
  7492. '//Christian Science Monitor translator. Code by Adam Crymble.
  7493.  
  7494. function scrape(doc, url) {
  7495.  
  7496.     var namespace = doc.documentElement.namespaceURI;
  7497.     var nsResolver = namespace ? function(prefix) {
  7498.         if (prefix == ''x'') return namespace; else return null;
  7499.     } : null;    
  7500.     
  7501.     var newItem = new Zotero.Item("newspaperArticle");
  7502.     
  7503.     
  7504.     if (doc.location.href.match("features.csmonitor")) {
  7505.         
  7506.     newItem.title = doc.title;
  7507.         
  7508.         
  7509.         if (doc.evaluate(''//div[@class="story"][@id="main"]/p/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7510.             newItem.abstractNote = doc.evaluate(''//div[@class="story"][@id="main"]/p/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7511.         }
  7512.         
  7513.         if (doc.evaluate(''//h3/span[@class="time-date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7514.             newItem.date = doc.evaluate(''//h3/span[@class="time-date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(" edition", '''');
  7515.         }
  7516.         
  7517.         if (doc.evaluate(''//h3/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7518.             
  7519.             var author = doc.evaluate(''//h3/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7520.             if (author.match("By ")) {
  7521.                 author = author.substr(3);
  7522.             }
  7523.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  7524.         }
  7525.         
  7526.         var title1 = doc.title;
  7527.         
  7528.         //Some entries do not work for some reason unbeknownst to me; this flag catches the problem and prevents an error, but doesn''t save the data properly.
  7529.         if (title1.match("csmonitor")) {
  7530.             newItem.title = title1.substr(0, title1.length-15);
  7531.         } else {
  7532.             newItem.title = "This Entry Cannot Be Saved";
  7533.             newItem.abstractNote = "Entry must be entered manually";
  7534.         }
  7535.         
  7536.         
  7537.         
  7538.     } else {
  7539.         
  7540.         //title
  7541.         if (doc.evaluate(''//div[@id="storyContent"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7542.             
  7543.             var title1 = doc.evaluate(''//div[@id="storyContent"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7544.             var words = title1.split(" ");
  7545.             for (var i in words) {
  7546.                 words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  7547.             }
  7548.             title1 = words.join(" ");
  7549.             newItem.title = title1;
  7550.         } else {
  7551.             newItem.title = "no title found";
  7552.         }
  7553.         
  7554.         //abstract note
  7555.         if (doc.evaluate(''//div[@id="storyContent"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7556.             newItem.abstractNote = doc.evaluate(''//div[@id="storyContent"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7557.         }
  7558.         
  7559.         //date
  7560.         if (doc.evaluate(''//div[@id="storyContent"]/p[@class="postdate"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7561.             var date1 = doc.evaluate(''//div[@id="storyContent"]/p[@class="postdate"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7562.             date1 = date1.replace(/from the /g, '''');
  7563.             date1 = date1.replace(/ edition/g, '''');
  7564.             newItem.date = date1;
  7565.         }
  7566.         
  7567.         //author
  7568.         if (doc.evaluate(''//address[@class="byline"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7569.             var author = doc.evaluate(''//address[@class="byline"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7570.  
  7571.             if (author.match("By ")) {
  7572.                 author = author.substr(3);
  7573.             }
  7574.             var words = author.split(" ");
  7575.             for (var i in words) {
  7576.                 words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  7577.             }
  7578.             author = words.join(" ");
  7579.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  7580.         } 
  7581.     
  7582.     }
  7583.  
  7584.     newItem.publicationTitle = "Christian Science Monitor";
  7585.     newItem.url = doc.location.href;
  7586.  
  7587.     newItem.complete();
  7588. }
  7589.  
  7590. function doWeb(doc, url) {
  7591.     var namespace = doc.documentElement.namespaceURI;
  7592.     var nsResolver = namespace ? function(prefix) {
  7593.         if (prefix == ''x'') return namespace; else return null;
  7594.     } : null;
  7595.     
  7596.     var articles = new Array();
  7597.     
  7598.     if (detectWeb(doc, url) == "multiple") {
  7599.         var items = new Object();
  7600.     
  7601.         var titles = doc.evaluate(''//p[@id="searchResultRow"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7602.         
  7603.         var next_title;
  7604.         while (next_title = titles.iterateNext()) {
  7605.             if (!next_title.href.match("features")) {
  7606.                 items[next_title.href] = next_title.textContent;
  7607.             }
  7608.         }
  7609.         items = Zotero.selectItems(items);
  7610.         for (var i in items) {
  7611.             articles.push(i);
  7612.         }
  7613.     } else {
  7614.         articles = [url];
  7615.     }
  7616.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7617.     Zotero.wait();
  7618. }');
  7619.  
  7620.  
  7621. REPLACE INTO translators VALUES ('138de272-0d2a-4ab5-8cfb-0fd879958d04', '1.0.0b4.r5', '', '2008-07-25 17:40:00', '0', '100', '4', 'AdvoCAT', 'Adam Crymble', '^http://(142.57.32.51|library.lsuc.on.ca)', 
  7622. 'function detectWeb(doc, url) {
  7623.     if (doc.location.href.match("Search_Code")) {
  7624.         return "multiple";
  7625.     } else if (doc.title.match("Record View")) {
  7626.         return "book";
  7627.     }
  7628. }', 
  7629. 'function associateData (newItem, dataTags, field, zoteroField) {
  7630.     if (dataTags[field]) {
  7631.         newItem[zoteroField] = dataTags[field];
  7632.     }
  7633. }
  7634.  
  7635. function scrape(doc, url) {
  7636.     var namespace = doc.documentElement.namespaceURI;
  7637.     var nsResolver = namespace ? function(prefix) {
  7638.         if (prefix == ''x'') return namespace; else return null;
  7639.     } : null;    
  7640.     
  7641.     var dataTags = new Object();
  7642.     var fieldTitle;
  7643.     
  7644.     var newItem = new Zotero.Item("book");
  7645.  
  7646.     var headers = doc.evaluate(''//table[2]/tbody/tr/th'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7647.     var xPathCount = doc.evaluate(''count (//table[2]/tbody/tr/th)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7648.     var contents = doc.evaluate(''//table[2]/tbody/tr/td'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7649.  
  7650.     for (i=0; i<xPathCount.numberValue; i++) {         
  7651.                  
  7652.              fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, '''');
  7653.              if (!fieldTitle.match(/\w/)) {
  7654.                  fieldTitle = "Blank" + i;
  7655.              }
  7656.               dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  7657.          }
  7658.  
  7659.     if (dataTags["MainAuthor:"]) {
  7660.         var author = dataTags["MainAuthor:"];
  7661.         if (author.match(", ") && !author.match(":")) {
  7662.             var authors = author.split(", ");
  7663.             author = authors[1] + " " + authors[0];
  7664.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));    
  7665.         } else {
  7666.             newItem.creators.push({lastName: author, creatorType: "creator"});            
  7667.         }
  7668.     }
  7669.  
  7670.     if (dataTags["Published:"]) {
  7671.     
  7672.         if (dataTags["Published:"].match(": ")) {
  7673.             var place1 = dataTags["Published:"].indexOf(": ");
  7674.             newItem.place = dataTags["Published:"].substr(0, place1);
  7675.             var publisher1 = dataTags["Published:"].substr(place1 + 2);
  7676.             
  7677.             if (publisher1.match(", ")) {
  7678.                 var date1 = publisher1.lastIndexOf(", ");
  7679.                 newItem.date = publisher1.substr(date1 +2);
  7680.                 newItem.publisher = publisher1.substr(0, date1);
  7681.             } else {
  7682.                 newItem.publisher = publisher1;
  7683.             }
  7684.         } else {
  7685.             newItem.publisher = publisher1;
  7686.         }
  7687.     }
  7688.     associateData (newItem, dataTags, "Title:", "title");
  7689.     associateData (newItem, dataTags, "Database:", "repository");
  7690.     associateData (newItem, dataTags, "Description:", "pages");
  7691.     associateData (newItem, dataTags, "Edition:", "edition");
  7692.  
  7693.     newItem.url = doc.location.href;
  7694.  
  7695.     newItem.complete();
  7696. }
  7697.  
  7698. function doWeb(doc, url) {
  7699.     var namespace = doc.documentElement.namespaceURI;
  7700.     var nsResolver = namespace ? function(prefix) {
  7701.         if (prefix == ''x'') return namespace; else return null;
  7702.     } : null;
  7703.     
  7704.     var articles = new Array();
  7705.     
  7706.     if (detectWeb(doc, url) == "multiple") {
  7707.         var items = new Object();
  7708.         
  7709.         var titles = doc.evaluate(''//form[2]/table/tbody/tr/td[3]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7710.         
  7711.         var next_title;
  7712.         while (next_title = titles.iterateNext()) {
  7713.             items[next_title.href] = next_title.textContent;
  7714.         }
  7715.         items = Zotero.selectItems(items);
  7716.         for (var i in items) {
  7717.             articles.push(i);
  7718.         }
  7719.     } else {
  7720.         articles = [url];
  7721.     }
  7722.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7723.     Zotero.wait();
  7724. }');
  7725.  
  7726.  
  7727. REPLACE INTO translators VALUES ('add79dfd-7951-4c72-af1d-ce1d50aa4fb4', '1.0.0b4.r5', '', '2008-07-07 14:50:00', '0', '100', '4', 'informIT database', 'Adam Crymble', 'http://www.informit.com', 
  7728. 'function detectWeb(doc,  url) {
  7729.     if (doc.title.match("Search Results")) {
  7730.         return "multiple";
  7731.     } else if (doc.location.href.match("topics")) {
  7732.         return "multiple";
  7733.         
  7734.     } else if (doc.location.href.match("product")) {
  7735.         return "book";
  7736.     } else if (doc.location.href.match("guides")) {
  7737.         return "book";
  7738.         
  7739.     } else if (doc.location.href.match("library")) {
  7740.         return "bookSection";
  7741.     } else if (doc.location.href.match(/articles\/article/)) {
  7742.         return "bookSection";
  7743.     }
  7744. }', 
  7745. '//informIT database translator. Code by Adam Crymble
  7746.  
  7747. function scrape(doc, url) {
  7748.  
  7749.     var namespace = doc.documentElement.namespaceURI;
  7750.     var nsResolver = namespace ? function(prefix) {
  7751.         if (prefix == ''x'') return namespace; else return null;
  7752.     } : null;    
  7753.     
  7754.     var dataTags = new Object();
  7755.     
  7756.     //FOR GUIDES
  7757.         if (doc.location.href.match("guides")) {
  7758.             var newItem = new Zotero.Item("book");
  7759.             newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7760.             
  7761.             var authors = doc.evaluate(''//div[@class="titling"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7762.         }
  7763.     
  7764.     //FOR ARTICLES
  7765.         if (doc.location.href.match(/articles\/article/)) {
  7766.             var newItem = new Zotero.Item("bookSection");
  7767.             
  7768.             var contents = doc.evaluate(''//div[@id="articleHeader"]/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7769.             var xPathCount = doc.evaluate(''count (//div[@id="articleHeader"]/ul/li)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7770.             
  7771.             var authors = contents.iterateNext().textContent.substr(3);
  7772.                         
  7773.             if (doc.evaluate(''//div[@class="relatedBook"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7774.                 newItem.bookTitle = doc.evaluate(''//div[@class="relatedBook"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7775.             }
  7776.                 
  7777.             newItem.date = contents.iterateNext().textContent;
  7778.             
  7779.             var rights1;
  7780.             if (xPathCount.numberValue> 2) {
  7781.                 newItem.rights = contents.iterateNext().textContent;
  7782.             }
  7783.             
  7784.             newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7785.         
  7786.         } else if (doc.evaluate(''//ul[@class="bibliography"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7787.  
  7788.  
  7789.     //FOR STORE BOOKS
  7790.         var newItem = new Zotero.Item("book");
  7791.         
  7792.         var contents = doc.evaluate(''//ul[@class="bibliography"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7793.         var xPathCount = doc.evaluate(''count (//ul[@class="bibliography"]/li)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7794.     
  7795.         for (i=0; i<xPathCount.numberValue; i++) {         
  7796.                  dataTags[i] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  7797.              }
  7798.     
  7799.         var authors = dataTags[0].substr(3);            
  7800.     
  7801.         if (dataTags[1].match("Published")) {
  7802.             var publisherInfo = dataTags[1].substr(10);
  7803.             var date = publisherInfo.substr(0, 12);
  7804.             newItem.date = date;
  7805.             
  7806.             if (publisherInfo.match("by ")) {
  7807.                 var publishCo = publisherInfo.split("by ");
  7808.                 newItem.publisher = publishCo[1];
  7809.             }
  7810.         }
  7811.         var extraStuff = dataTags[2].split(/\n/);
  7812.         
  7813.         var pageCut = extraStuff[0].indexOf("Pages");
  7814.         var dimensions = extraStuff[0].substr(0, pageCut).split("Dimensions ");
  7815.         
  7816.         newItem.description = "Dimensions: " + dimensions[1];
  7817.         newItem.pages = extraStuff[0].substr(pageCut+6);
  7818.         newItem.edition = extraStuff[1].replace(/Edition\:\s| \s\s*/g, '''');
  7819.         newItem.ISBN = extraStuff[2].substr(31, 18);
  7820.         newItem.title = doc.evaluate(''//h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7821.         
  7822.         
  7823.        //FOR LIBRARY BOOKS    
  7824.         } else if (doc.location.href.match("library")) {
  7825.             
  7826.             var newItem = new Zotero.Item("bookSection");
  7827.             
  7828.             newItem.title = doc.evaluate(''//h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7829.             var meta = doc.evaluate(''//div[@id="columnOne"]/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7830.             newItem.bookTitle = meta.iterateNext().textContent;
  7831.             
  7832.             var authors = meta.iterateNext().textContent.substr(3);
  7833.         }
  7834.  
  7835.      //SHARED    
  7836.         var noMoreAuthor = 0;
  7837.         
  7838.         if (authors.match(" and ")) {
  7839.             authors = authors.split(" and ");
  7840.         } else if (authors.match(", ")) {
  7841.             authors = authors.split(", ");
  7842.         } else {
  7843.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author"));
  7844.             noMoreAuthor = 1;
  7845.         }
  7846.         
  7847.         if (authors.length>0 && noMoreAuthor != 1) {
  7848.             
  7849.             for (var i = 0; i < authors.length; i++) {
  7850.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  7851.             }
  7852.         }
  7853.     
  7854.     newItem.url = doc.location.href;
  7855.     if (newItem.publisher) newItem.publisher = Zotero.Utilities.trimInternal(newItem.publisher);
  7856.     newItem.complete();
  7857. }
  7858.  
  7859. function doWeb(doc, url) {
  7860.     var namespace = doc.documentElement.namespaceURI;
  7861.     var nsResolver = namespace ? function(prefix) {
  7862.         if (prefix == ''x'') return namespace; else return null;
  7863.     } : null;
  7864.     
  7865.     var articles = new Array();
  7866.     
  7867.     if (detectWeb(doc, url) == "multiple") {
  7868.         var items = new Object();
  7869.         var next_title;
  7870.         
  7871.        //xPath for Topics pages, else xPaths for regular search pages.
  7872.         if (doc.location.href.match("topics")) {
  7873.             var titles = doc.evaluate(''//div[@class="productList articles"]/dl/dt/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7874.         } else {
  7875.             var titles = doc.evaluate(''//td[3][@class="results"]/ul/li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7876.             var chapters = doc.evaluate(''//dt/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  7877.         }
  7878.         
  7879.         while (next_title = titles.iterateNext()) {
  7880.             items[next_title.href] = next_title.textContent;
  7881.         }
  7882.         
  7883.         if (doc.title.match("Search Results")) {
  7884.             while (next_title = chapters.iterateNext()) {
  7885.                 items[next_title.href] = next_title.textContent;
  7886.             }
  7887.         }
  7888.         
  7889.         items = Zotero.selectItems(items);
  7890.         for (var i in items) {
  7891.             articles.push(i);
  7892.         }
  7893.     } else {
  7894.         articles = [url];
  7895.     }
  7896.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  7897.     Zotero.wait();
  7898. }');
  7899.  
  7900. REPLACE INTO translators VALUES ('587aa172-af1a-4cab-b188-2b6d392cae5c', '1.0', '', '2008-09-22 20:20:00', '0', '100', '4', 'Unidade de Biologia da Conserva├ºao', 'Giovanni Manghi and Michael Berkowitz', 'http://www.ubc.uevora.pt/', 
  7901. 'function detectWeb(doc, url) {
  7902.    if(doc.title == "UBC: referencia bibliografica") {
  7903.     return "book";
  7904.    } else if (doc.evaluate(''//tr[@class]/td/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  7905.     return "multiple";
  7906.    }
  7907. }', 
  7908. 'function doWeb(doc, url) {
  7909.     if (detectWeb(doc, url) == "multiple") {
  7910.         var xpath = ''//tr[@class]/td/a'';
  7911.         var items = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  7912.         var next_item;
  7913.         var arts = new Object();
  7914.         while (next_item = items.iterateNext()) {
  7915.             arts[next_item.href] = Zotero.Utilities.trimInternal(next_item.textContent);
  7916.         }
  7917.         arts = Zotero.selectItems(arts);
  7918.         var newDocs = new Array();
  7919.         for (var i in arts) {
  7920.             newDocs.push(i);
  7921.         }
  7922.         Zotero.debug(newDocs);
  7923.         Zotero.Utilities.processDocuments(newDocs, function(newDoc) { scrape(newDoc, newDoc.location.href); }, function() {Zotero.done();});
  7924.     } else {
  7925.         scrape(doc,url);
  7926.     }
  7927. }
  7928.  
  7929.  
  7930. function scrape(doc,url) {
  7931.        var xpath = "/html/body/div/div/div[3]/div[3]/table/tbody/tr/td"
  7932.        var xpathurl ="/html/body/div/div/div[3]/div[3]/table/tbody/tr/td/a[1]"
  7933.        var allRefText = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  7934.        var allRefTexturl = Zotero.Utilities.cleanString(doc.evaluate(xpathurl, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  7935.  
  7936.  
  7937.  
  7938.  
  7939. // bib data scraper code here
  7940.  
  7941. function getItem(reftext,re) {
  7942.    var item = reftext.match(re);
  7943.    // Zotero.debug(item[1]);
  7944.    return item[1];
  7945. }
  7946.  
  7947. var TipoRe = "Type:(.*?)Title";
  7948. var tipoo = getItem(allRefText,TipoRe);
  7949.  
  7950. var titleRe = "Title:(.*?)Author";
  7951. var title = getItem(allRefText,titleRe);
  7952.  
  7953. var authorsRe = "Author.*?: (.*?)Journal";
  7954. var authors = getItem(allRefText,authorsRe);
  7955.  
  7956. var journalRe = "Journal:(.*?)Year";
  7957. var journal = getItem(allRefText,journalRe);
  7958.  
  7959. var yearRe = "Year:(.*?)Volume";
  7960. var year = getItem(allRefText,yearRe);
  7961.  
  7962. var volRe = "Volume:(.*?)Number";
  7963. var vol = getItem(allRefText,volRe);
  7964.  
  7965. var numRe = "Number:(.*?)Pages";
  7966. var num = getItem(allRefText,numRe);
  7967.  
  7968. var pageRe = "Pages:(.*?)Abstract";
  7969. var page = getItem(allRefText,pageRe);
  7970.  
  7971. var abstractRe = "Abstract:(.*?)Keywords";
  7972. var abstract = getItem(allRefText,abstractRe);
  7973.  
  7974. var keyRe = "Keywords:(.*?)Link";
  7975. var key = getItem(allRefText,keyRe);
  7976.  
  7977.  
  7978.  
  7979.  
  7980. // zotero entry creation code here
  7981.  
  7982. itemTypeMap = {
  7983.     article:"journalArticle",
  7984.     book:"book",
  7985.     conference:"conferencePaper",
  7986.     inproceedings:"conferencePaper",
  7987.     inbook:"bookSection",
  7988.     incollection:"bookSection",
  7989.     mastersthesis:"thesis",
  7990.     other:"journalArticle",
  7991.     phdthesis:"thesis",
  7992.     proceedings:"conferencePaper"
  7993. };
  7994.  
  7995. if (itemTypeMap[tipoo]) {
  7996.     tipooo = itemTypeMap[tipoo];
  7997. } else {
  7998.     tipooo = ''document'';
  7999. }
  8000.  
  8001. var newArticle = new Zotero.Item(tipooo);
  8002.  
  8003.        var aus = authors.split(",");
  8004.         for (var i=0; i< aus.length ; i++) {
  8005.                 newArticle.creators.push(Zotero.Utilities.cleanAuthor(aus[i],"author"));
  8006.        }
  8007.  
  8008.        newArticle.title = title;
  8009.        newArticle.publicationTitle = journal;
  8010.        newArticle.date = year;
  8011.        newArticle.volume = vol;
  8012.        newArticle.issue = num;
  8013.        newArticle.pages = page;
  8014.        newArticle.abstractNote = abstract;
  8015.        newArticle.keywords = key;
  8016.          newArticle.url = url;
  8017.  
  8018.  
  8019. newArticle.complete();
  8020. }');
  8021.  
  8022. REPLACE INTO translators VALUES ('e9632edc-8032-4dc5-b2d4-284d481583e6', '1.0', '', '2008-08-06 17:00:00', '0', '100', '4', 'SAE International', 'Michael Berkowitz', 'http://www.sae.org/', 
  8023. 'function detectWeb(doc, url) {
  8024.     if (doc.evaluate(''//td[2][@class="search-results"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8025.         return "multiple";
  8026.     } else if (url.match(/\/books\//)) {return "book";}
  8027.     else if (url.match(/\/papers\//)) {return "conferencePaper";}
  8028. }', 
  8029. 'function doWeb(doc, url) {
  8030.     var arts = new Array();
  8031.     if (detectWeb(doc, url) == "multiple") {
  8032.         var items = new Object();
  8033.         var links = doc.evaluate(''//td[2][@class="search-results"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  8034.         var link;
  8035.         while (link = links.iterateNext()) {
  8036.             items[link.href] = link.textContent;
  8037.         }
  8038.         items = Zotero.selectItems(items);
  8039.         for (var i in items) {
  8040.             arts.push(i);
  8041.         }
  8042.     } else {
  8043.         arts = [url];
  8044.     }
  8045.     Zotero.Utilities.processDocuments(arts, function(doc) {
  8046.         var type = detectWeb(doc, doc.location.href);
  8047.         if (type == "paper") {
  8048.             var data = new Object();
  8049.             var metas = doc.evaluate(''//meta'', doc, null, XPathResult.ANY_TYPE, null);
  8050.             var meta;
  8051.             while (meta = metas.iterateNext()) {
  8052.                 name = meta.name;
  8053.                 content = meta.content;
  8054.                 if (data[name]) {
  8055.                     data[name] = data[name] + ";" + content;
  8056.                 } else {
  8057.                     data[name] = content;
  8058.                 }
  8059.             }
  8060.             var item = new Zotero.Item("conferencePaper");
  8061.             item.title = doc.evaluate(''//title'', doc, null, XPathResult.ANY_TYPe, null).iterateNext().textContent;
  8062.             item.data = data[''publ_date''];
  8063.             item.url = data[''identifier_url''];
  8064.             var authors = data[''author''].split(/\s+;/);
  8065.             for each (var aut in authors) {
  8066.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  8067.             }
  8068.             item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//td[1][@class="spg spg-left"]/p[strong[contains(text(), "Abstract")]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(9));
  8069.         } else if (type = "book") {
  8070.             var item = new Zotero.Item("book");
  8071.             var data = doc.evaluate(''//p[strong[contains(text(), "ISBN")]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8072.             item.ISBN = data.match(/ISBN Number:\s+([\d\-]+)/)[1];
  8073.             item.date = data.match(/Date Published:\s+(.*)\n/)[1];
  8074.             item.url = doc.location.href;
  8075.             item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//title'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  8076.             item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//td[1][@class="spg spg-left"]/p[contains(text(), ".")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  8077.         }
  8078.         item.attachments = [{url:item.url, title:item.title, mimeType:"text/html"}];
  8079.         item.complete();
  8080.     }, function() {Zotero.done;});
  8081.     Zotero.wait();
  8082. }');
  8083.  
  8084. REPLACE INTO translators VALUES ('48d3b115-7e09-4134-ad5d-0beda6296761', '1.0', '', '2008-08-06 17:00:00', '0', '100', '4', 'SPIE Digital Library', 'Michael Berkowitz', 'http://spiedl.aip.org/', 
  8085. 'function detectWeb(doc, url) {
  8086.     if (doc.evaluate(''//table[@class="searchResultsTable"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8087.         return "multiple";
  8088.     } else if (doc.evaluate(''//div[@id="articletoolsdisplay"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8089.         return "journalArticle";
  8090.     }
  8091. }', 
  8092. '//http://spiedl.aip.org/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=JBOPFO000013000002024024000001&downloadcitation=+Go+
  8093.  
  8094. function doWeb(doc, url) {
  8095.     var arts = new Array();
  8096.     if (detectWeb(doc, url) == "multiple") {
  8097.         var items = new Object();
  8098.         var results = doc.evaluate(''//table[@class="searchResultsTable"]/tbody/tr'', doc, null, XPathResult.ANY_TYPE, null);
  8099.         var result;
  8100.         while (result = results.iterateNext()) {
  8101.             var title = doc.evaluate(''.//td[3]/a[1]'', result, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8102.             var id = doc.evaluate(''.//td[2]/input'', result, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  8103.             items[id] = title;
  8104.         }
  8105.         items = Zotero.selectItems(items);
  8106.         for (var i in items) {
  8107.             arts.push(i);
  8108.         }
  8109.     } else {
  8110.         var id = doc.evaluate(''//input[@name="SelectCheck"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  8111.         arts = [id];
  8112.     }    
  8113.     
  8114.     var getstr1 = ''http://'' + doc.location.host + ''/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck='';
  8115.     var getstr2 = ''&downloadcitation=+Go+'';
  8116.     for each (var id in arts) {
  8117.         var get = getstr1 + id + getstr2;
  8118.         Zotero.Utilities.HTTP.doGet(get, function(text) {
  8119.             Zotero.debug(text);
  8120.             var translator = Zotero.loadTranslator("import");
  8121.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  8122.             translator.setString(text);
  8123.             translator.translate();
  8124.         });
  8125.     }
  8126.     
  8127. }');
  8128.  
  8129. REPLACE INTO translators VALUES ('87766765-919e-4d3b-9071-3dd7efe984c8', '1.0.0b4.r5', '', '2008-07-16 20:10:00', '1', '100', '4', 'Revues.org', 'Michael Berkowitz', 'http://.*\.revues\.org', 
  8130. 'function detectWeb(doc, url) {
  8131.     if (doc.evaluate(''//div[@id="inside"]/div[@class="sommaire"]/dl[@class="documents"]/dd[@class="titre"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()
  8132.         || doc.evaluate(''//ul[@class="summary"]//div[@class="title"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8133.         return "multiple";
  8134.     } else if (doc.evaluate(''//h1[@id="docTitle"]/span[@class="text"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || url.match(/document\d+/)) {
  8135.         return "journalArticle";
  8136.     }
  8137. }', 
  8138. 'function doWeb(doc, url) {
  8139.     var arts = new Array();
  8140.     if (detectWeb(doc, url) == "multiple") {
  8141.         if (doc.evaluate(''//ul[@class="summary"]//div[@class="title"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8142.             var xpath = ''//ul[@class="summary"]//div[@class="title"]/a'';
  8143.         } else if (doc.evaluate(''//div[@id="inside"]/div[@class="sommaire"]/dl[@class="documents"]/dd[@class="titre"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8144.             var xpath = ''//div[@id="inside"]/div[@class="sommaire"]/dl[@class="documents"]/dd[@class="titre"]/a'';
  8145.         }
  8146.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  8147.         var title;
  8148.         var items = new Object();
  8149.         while (title = titles.iterateNext()) {
  8150.             items[title.href] = title.textContent;
  8151.         }
  8152.         items = Zotero.selectItems(items);
  8153.         for (var i in items) {
  8154.             arts.push(i);
  8155.         }
  8156.     } else {
  8157.         arts = [url];
  8158.     }
  8159.       Zotero.Utilities.processDocuments(arts, function(doc) {
  8160.         var metas = doc.evaluate(''//meta'', doc, null, XPathResult.ANY_TYPE, null);
  8161.         var meta;
  8162.         var data = new Object();
  8163.         while (meta = metas.iterateNext()) {
  8164.             if (data[meta.name]) {
  8165.                 data[meta.name.toLowerCase()] = data[meta.name.toLowerCase()] + ";" + meta.content;
  8166.             } else {
  8167.                 data[meta.name.toLowerCase()] = meta.content
  8168.             }
  8169.         }
  8170.         var item = new Zotero.Item("journalArticle");
  8171.         item.url = data[''url''];
  8172.         var authors = data[''author''].split('';'');
  8173.         for each (var aut in authors) {
  8174.             if (aut.match(/\w+/)) item.creators.push(Zotero.Utilities.cleanAuthor(aut.replace(/(.*)\s([^\s]+)$/, "$2 $1"), "author"));
  8175.         }
  8176.         item.tags = data[''dc.subject''].split(/,\s+/);
  8177.         item.date = data[''dc.date''];
  8178.         item.title = data[''dc.title''];
  8179.         if (data[''dc.relation.ispartof'']) item.publicationTitle = data[''dc.relation.ispartof''].match(/^[^,]+/)[0];
  8180.         item.abstractNote = data[''description''];
  8181.         if (!item.abstractNote && data[''dc.description'']) item.abstractNote = data[''dc.description''];
  8182.         
  8183.         item.complete();
  8184.     }, function() {Zotero.done;});
  8185.     Zotero.wait();
  8186. }');
  8187.  
  8188. REPLACE INTO translators VALUES ('daa26181-71d4-48ef-8cac-54c06ff4c20e', '1.0.0b4.r5', '', '2008-07-07 23:40:00', '0', '100', '4', 'Citebase', 'Michael Berkowitz', 'http://(www.)?citebase.org/', 
  8189. 'function detectWeb(doc, url) {
  8190.     if (url.match(/\/search/)) {
  8191.         return "multiple";
  8192.     } else if (url.match(/\/abstract/)) {
  8193.         return "journalArticle";
  8194.     }
  8195. }', 
  8196. 'function doWeb(doc, url) {
  8197.     var articles = new Array();
  8198.     if (detectWeb(doc, url) == "multiple") {
  8199.         var links = doc.evaluate(''//div[@class="rs_match"]/div/a[@class="abs_title"]'', doc, null, XPathResult.ANY_TYPE, null);
  8200.         var items = new Object();
  8201.         var link;
  8202.         while (link = links.iterateNext()) {
  8203.             items[link.href] = link.textContent;
  8204.         }
  8205.         items = Zotero.selectItems(items);
  8206.         for (var i in items) {
  8207.             articles.push(i);
  8208.         }
  8209.     } else {
  8210.         articles = [url];
  8211.     }
  8212.  
  8213.     Zotero.Utilities.processDocuments(articles, function(doc) {
  8214.         var biburl = doc.evaluate(''//a[contains(text(), "BibTeX")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  8215.         if (doc.evaluate(''/html/body/div[@class="body"]/div[@class="abstract"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) var abs = Zotero.Utilities.trimInternal(doc.evaluate(''/html/body/div[@class="body"]/div[@class="abstract"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  8216.         var translator = Zotero.loadTranslator("import");
  8217.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  8218.         Zotero.Utilities.HTTP.doGet(biburl, function(text) {
  8219.             translator.setString(text);
  8220.             translator.setHandler("itemDone", function(obj, item) {
  8221.                 if (abs) {
  8222.                     if (abs.match(/^Abstract/)) {
  8223.                         item.abstractNote = abs.substr(9);
  8224.                     } else {
  8225.                         item.abstractNote = abs;
  8226.                     }
  8227.                 }
  8228.                 item.attachments = [{url:item.url, title:"Citebase Snapshot", mimeType:"text/html"}];
  8229.                 item.complete();
  8230.             });
  8231.             translator.translate();
  8232.         });
  8233.     }, function() {Zotero.done;});
  8234.     Zotero.wait();
  8235. }');
  8236.  
  8237. REPLACE INTO translators VALUES ('dd149efc-7f0e-43e4-b3df-b6d15e171717', '1.0.0b4.r5', '', '2008-07-15 19:40:00', '0', '100', '4', 'Pers├⌐e', 'Adam Crymble', 'http://www.persee.fr', 
  8238. 'function detectWeb(doc, url) {
  8239.     if (doc.location.href.match("search") && doc.evaluate(''//div[@id="searchResults"]/div[@class="oneResult"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8240.         return "multiple";
  8241.     } else if (doc.location.href.match("article")) {
  8242.         return "journalArticle";
  8243.     }
  8244. }', 
  8245. '//Persee Translator. Code by Adam Crymble
  8246.  
  8247. function scrape(doc, url) {
  8248.  
  8249.     var namespace = doc.documentElement.namespaceURI;
  8250.     var nsResolver = namespace ? function(prefix) {
  8251.         if (prefix == ''x'') return namespace; else return null;
  8252.     } : null;    
  8253.     
  8254.     var newItem = new Zotero.Item("journalArticle");
  8255.  
  8256.     newItem.url = doc.location.href;
  8257.     newItem.title = doc.evaluate(''//div[@class="oneResult"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s+$/g, '''');
  8258.  
  8259.     //various journal info
  8260.     if (doc.title.match(", ")) {
  8261.         var contents = doc.title.split(", ");
  8262.             newItem.publicationTitle = contents[0].substr(9);
  8263.         for (var i = 1; i < contents.length; i++) {
  8264.             if (contents[i].match("Year ")) {
  8265.                 newItem.date = contents[i].substr(5);
  8266.             } else if (contents[i].match("Volume ")) {
  8267.                 newItem.volume = contents[i].substr(7);
  8268.             } else if (contents[i].match("Issue ")) {
  8269.                 newItem.issue = contents[i].substr(6);
  8270.             } else if (contents[i].match("pp. ")) {
  8271.                 newItem.pages = contents[i].substr(4);
  8272.             }
  8273.         }
  8274.     }
  8275.     
  8276.     //authors
  8277.     var getAuthors = doc.evaluate(''//div[@class="oneResult"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s+$/g, '''');
  8278.     var chopAuthors1 = getAuthors.indexOf(newItem.title) + newItem.title.length;
  8279.     var chopAuthors2 = getAuthors.indexOf(newItem.publicationTitle);
  8280.     
  8281.     var authors = getAuthors.substr(chopAuthors1, chopAuthors2-chopAuthors1);
  8282.     if (authors.match(", ")) {
  8283.         authors = authors.split(", ");
  8284.         for (var i in authors) {
  8285.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));    
  8286.         }
  8287.     } else {
  8288.         newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author"));    
  8289.     }
  8290.     
  8291.     newItem.complete();
  8292. }
  8293.  
  8294. function doWeb(doc, url) {
  8295.     var namespace = doc.documentElement.namespaceURI;
  8296.     var nsResolver = namespace ? function(prefix) {
  8297.         if (prefix == ''x'') return namespace; else return null;
  8298.     } : null;
  8299.     
  8300.     var articles = new Array();
  8301.     
  8302.     if (detectWeb(doc,url) == "journalArticle") {
  8303.         articles = [url];
  8304.         
  8305.     } else if (detectWeb(doc, url) == "multiple") {
  8306.         var items = new Object();
  8307.         
  8308.         var titles = doc.evaluate(''//div[@id="searchResults"]/div[@class="oneResult"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8309.         
  8310.         var next_title;
  8311.         var titlesArray = new Array();
  8312.         var linksArray = new Array();
  8313.         
  8314.          while (next_title = titles.iterateNext()) {
  8315.              titlesArray.push(next_title.textContent.replace(/^\s*|\s+$/g, ''''));
  8316.              linksArray.push(next_title.href);
  8317.          }
  8318.     
  8319.         for (var i = 0; i < titlesArray.length; i++) {
  8320.             
  8321.             if (linksArray[i].match("article")) {
  8322.                 items[linksArray[i]] = titlesArray[i];
  8323.             }
  8324.         }
  8325.         
  8326.         items = Zotero.selectItems(items);
  8327.         for (var i in items) {
  8328.             articles.push(i);
  8329.         }
  8330.     }
  8331.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  8332.     Zotero.wait();
  8333. }');
  8334.  
  8335. REPLACE INTO translators VALUES ('9932d1a7-cc6d-4d83-8462-8f6658b13dc0', '1.0.0b4.r5', '', '2008-07-07 14:50:00', '0', '100', '4', 'Biblio.com', 'Adam Crymble and Michael Berkowitz', 'http://www.biblio.com/', 
  8336. 'function detectWeb(doc, url) {
  8337.     if (doc.location.href.match("bookseller_search") || doc.location.href.match("bookstores") || doc.location.href.match("textbooks")) {
  8338.         
  8339.     } else if (doc.location.href.match("search")) {
  8340.         return "multiple";
  8341.     } else if (doc.location.href.match("books")) {
  8342.         return "book";
  8343.     }
  8344. }', 
  8345. '//Biblio.com translator. Code by Adam Crymble.
  8346.  
  8347. function associateData (newItem, dataTags, field, zoteroField) {
  8348.     if (dataTags[field]) {
  8349.         newItem[zoteroField] = dataTags[field];
  8350.     }
  8351. }
  8352.  
  8353. function scrape(doc, url) {
  8354.  
  8355.     var namespace = doc.documentElement.namespaceURI;
  8356.     var nsResolver = namespace ? function(prefix) {
  8357.         if (prefix == ''x'') return namespace; else return null;
  8358.     } : null;    
  8359.     
  8360.     var dataTags = new Object();
  8361.     var contents = new Array();
  8362.     var multiAuthors = new Array();
  8363.     var fieldTitle;
  8364.     var author1;
  8365.     
  8366.     var newItem = new Zotero.Item("book");
  8367.  
  8368.     var content = doc.evaluate(''//div[@class="smalltext1"][@id="infobox"]/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE,  null);
  8369.     var xPathCount = doc.evaluate(''count (//div[@class="smalltext1"][@id="infobox"]/ul/li)'', doc, nsResolver, XPathResult.ANY_TYPE,  null);
  8370.     
  8371.     for (i=0; i<xPathCount.numberValue; i++) {         
  8372.                  
  8373.              contents = content.iterateNext().textContent.split(": ");
  8374.              fieldTitle = contents[0].replace(/\s*/g, '''');
  8375.              dataTags[fieldTitle] = contents[1].replace(/^\s*|\s*$/g, '''');
  8376.          }
  8377.  
  8378.     //Authors
  8379.     if (doc.evaluate(''//td[2]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8380.         var authors = doc.evaluate(''//td[2]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8381.         if (authors.match(/\w/)) {
  8382.             if (authors.match(/^ by/)) {
  8383.                 authors = authors.substr(4);
  8384.                 if (authors.match(/;/)) {
  8385.                     multiAuthors = authors.split(";");
  8386.                     Zotero.debug(multiAuthors);
  8387.                     for each (var aut in multiAuthors) {
  8388.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(aut, "author", true));
  8389.                     }
  8390.                 } else {
  8391.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author", true));
  8392.                 }
  8393.             } else {
  8394.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author"));
  8395.             }
  8396.         }
  8397.         
  8398.     }
  8399.     
  8400.     //extra
  8401.     if (dataTags["Quantityavailable"]) {
  8402.         newItem.extra = "Quantity Available: " + dataTags["Quantityavailable"];
  8403.     }
  8404.  
  8405.     associateData (newItem, dataTags, "Publisher", "publisher");
  8406.     associateData (newItem, dataTags, "Place", "place");
  8407.     associateData (newItem, dataTags, "Datepublished", "date");
  8408.     associateData (newItem, dataTags, "ISBN10", "ISBN");
  8409.     associateData (newItem, dataTags, "ISBN13", "ISBN");
  8410.     associateData (newItem, dataTags, "Pages", "pages");
  8411.     associateData (newItem, dataTags, "Edition", "edition");
  8412.  
  8413.     newItem.title = doc.evaluate(''//tbody/tr[1]/td[2]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s&+/g, '''');
  8414.     newItem.url = doc.location.href;
  8415.     newItem.complete();
  8416. }
  8417.  
  8418. function doWeb(doc, url) {
  8419.     var namespace = doc.documentElement.namespaceURI;
  8420.     var nsResolver = namespace ? function(prefix) {
  8421.         if (prefix == ''x'') return namespace; else return null;
  8422.     } : null;
  8423.     
  8424.     var articles = new Array();
  8425.     
  8426.     if (detectWeb(doc, url) == "multiple") {
  8427.         var items = new Object();
  8428.         
  8429.         var titles = doc.evaluate(''//table[@class="search-result"]/tbody/tr/td[2]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8430.         
  8431.         var next_title;
  8432.         while (next_title = titles.iterateNext()) {
  8433.             if (next_title.textContent.match(/\w/)) {
  8434.                 items[next_title.href] = next_title.textContent;
  8435.             }
  8436.         }
  8437.         items = Zotero.selectItems(items);
  8438.         for (var i in items) {
  8439.             articles.push(i);
  8440.         }
  8441.     } else {
  8442.         articles = [url];
  8443.     }
  8444.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  8445.     Zotero.wait();
  8446. }');
  8447.  
  8448. REPLACE INTO translators VALUES ('9932d1a7-cc6d-4d83-8462-8f6658b13dc0', '1.0.0b4.r5', '', '2008-07-07 14:50:00', '0', '100', '4', 'Biblio.com', 'Adam Crymble and Michael Berkowitz', 'http://www.biblio.com/', 
  8449. 'function detectWeb(doc, url) {
  8450.     if (doc.location.href.match("bookseller_search") || doc.location.href.match("bookstores") || doc.location.href.match("textbooks")) {
  8451.         
  8452.     } else if (doc.location.href.match("search")) {
  8453.         return "multiple";
  8454.     } else if (doc.location.href.match("books")) {
  8455.         return "book";
  8456.     }
  8457. }', 
  8458. '//Biblio.com translator. Code by Adam Crymble.
  8459.  
  8460. function associateData (newItem, dataTags, field, zoteroField) {
  8461.     if (dataTags[field]) {
  8462.         newItem[zoteroField] = dataTags[field];
  8463.     }
  8464. }
  8465.  
  8466. function scrape(doc, url) {
  8467.  
  8468.     var namespace = doc.documentElement.namespaceURI;
  8469.     var nsResolver = namespace ? function(prefix) {
  8470.         if (prefix == ''x'') return namespace; else return null;
  8471.     } : null;    
  8472.     
  8473.     var dataTags = new Object();
  8474.     var contents = new Array();
  8475.     var multiAuthors = new Array();
  8476.     var fieldTitle;
  8477.     var author1;
  8478.     
  8479.     var newItem = new Zotero.Item("book");
  8480.  
  8481.     var content = doc.evaluate(''//div[@class="smalltext1"][@id="infobox"]/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE,  null);
  8482.     var xPathCount = doc.evaluate(''count (//div[@class="smalltext1"][@id="infobox"]/ul/li)'', doc, nsResolver, XPathResult.ANY_TYPE,  null);
  8483.     
  8484.     for (i=0; i<xPathCount.numberValue; i++) {         
  8485.                  
  8486.              contents = content.iterateNext().textContent.split(": ");
  8487.              fieldTitle = contents[0].replace(/\s*/g, '''');
  8488.              dataTags[fieldTitle] = contents[1].replace(/^\s*|\s*$/g, '''');
  8489.          }
  8490.  
  8491.     //Authors
  8492.     if (doc.evaluate(''//td[2]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8493.         var authors = doc.evaluate(''//td[2]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8494.         if (authors.match(/\w/)) {
  8495.             if (authors.match(/^ by/)) {
  8496.                 authors = authors.substr(4);
  8497.                 if (authors.match(/;/)) {
  8498.                     multiAuthors = authors.split(";");
  8499.                     Zotero.debug(multiAuthors);
  8500.                     for each (var aut in multiAuthors) {
  8501.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(aut, "author", true));
  8502.                     }
  8503.                 } else {
  8504.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author", true));
  8505.                 }
  8506.             } else {
  8507.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author"));
  8508.             }
  8509.         }
  8510.         
  8511.     }
  8512.     
  8513.     //extra
  8514.     if (dataTags["Quantityavailable"]) {
  8515.         newItem.extra = "Quantity Available: " + dataTags["Quantityavailable"];
  8516.     }
  8517.  
  8518.     associateData (newItem, dataTags, "Publisher", "publisher");
  8519.     associateData (newItem, dataTags, "Place", "place");
  8520.     associateData (newItem, dataTags, "Datepublished", "date");
  8521.     associateData (newItem, dataTags, "ISBN10", "ISBN");
  8522.     associateData (newItem, dataTags, "ISBN13", "ISBN");
  8523.     associateData (newItem, dataTags, "Pages", "pages");
  8524.     associateData (newItem, dataTags, "Edition", "edition");
  8525.  
  8526.     newItem.title = doc.evaluate(''//tbody/tr[1]/td[2]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s&+/g, '''');
  8527.     newItem.url = doc.location.href;
  8528.     newItem.complete();
  8529. }
  8530.  
  8531. function doWeb(doc, url) {
  8532.     var namespace = doc.documentElement.namespaceURI;
  8533.     var nsResolver = namespace ? function(prefix) {
  8534.         if (prefix == ''x'') return namespace; else return null;
  8535.     } : null;
  8536.     
  8537.     var articles = new Array();
  8538.     
  8539.     if (detectWeb(doc, url) == "multiple") {
  8540.         var items = new Object();
  8541.         
  8542.         var titles = doc.evaluate(''//table[@class="search-result"]/tbody/tr/td[2]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8543.         
  8544.         var next_title;
  8545.         while (next_title = titles.iterateNext()) {
  8546.             if (next_title.textContent.match(/\w/)) {
  8547.                 items[next_title.href] = next_title.textContent;
  8548.             }
  8549.         }
  8550.         items = Zotero.selectItems(items);
  8551.         for (var i in items) {
  8552.             articles.push(i);
  8553.         }
  8554.     } else {
  8555.         articles = [url];
  8556.     }
  8557.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  8558.     Zotero.wait();
  8559. }');
  8560.  
  8561. REPLACE INTO translators VALUES ('f39dbd1c-229e-4abb-8414-a09fdbda37b7', '1.0.0b4.r5', '', '2008-06-29 21:10:00', '0', '100', '4', 'Archives Network of Alberta', 'Adam Crymble', 'http://208.38.46.62:8080/', 
  8562. 'function detectWeb(doc, url) {
  8563.     
  8564.     var xPathH3 = doc.evaluate(''//h3'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8565.     
  8566.     if (xPathH3.match("Search Results")) {
  8567.         return "multiple";
  8568.     } else if (xPathH3.match("Display")) {
  8569.         return "book";
  8570.     }
  8571. }', 
  8572. '//Archives Network of Alberta translator. Code by Adam Crymble
  8573.  
  8574. function associateData (newItem, dataTags, field, zoteroField) {
  8575.     if (dataTags[field]) {
  8576.         newItem[zoteroField] = dataTags[field];
  8577.     }
  8578. }
  8579.  
  8580. function scrape(doc, url) {
  8581.     var namespace = doc.documentElement.namespaceURI;
  8582.     var nsResolver = namespace ? function(prefix) {
  8583.         if (prefix == ''x'') return namespace; else return null;
  8584.     } : null;
  8585.     
  8586.     var newItem = new Zotero.Item("book");
  8587.     
  8588.     var dataTags = new Object();
  8589.     var manyAuthors = new Array();
  8590.     var tagsContent = new Array();
  8591.     var tagsContent1 = new Array();
  8592.     
  8593.     var xPathHeaders = doc.evaluate(''//td[1][@class="datalabel"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8594.     var xPathContent = doc.evaluate(''//td[2][@class="datatext"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8595.     var xPathCount = doc.evaluate(''count (//td[1][@class="datalabel"])'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8596.     
  8597.     for (var i = 0; i < xPathCount.numberValue; i++) {
  8598.         fieldTitle = xPathHeaders.iterateNext().textContent.replace(/\s+/g, '''');
  8599.         
  8600.         if (fieldTitle =="Provenance:") {
  8601.                  
  8602.                  dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  8603.                  
  8604.                  if (dataTags[fieldTitle].match("; ")) {
  8605.                      manyAuthors = dataTags[fieldTitle].split("; ");
  8606.                  } else {
  8607.                      manyAuthors.push(dataTags[fieldTitle]);
  8608.                  }
  8609.                  Zotero.debug(manyAuthors);
  8610.                  
  8611.                  for (var j = 0; j < manyAuthors.length; j++) {
  8612.                      if (manyAuthors[j].match(", ")) {
  8613.                          var authorName = manyAuthors[j].split(",");
  8614.                          authorName[0] = authorName[0].replace(/^\s*|\s*$/g, '''');
  8615.                          authorName[1] = authorName[1].replace(/^\s*|\s*$/g, '''');
  8616.                          newItem.creators.push(Zotero.Utilities.cleanAuthor((authorName[1] + (" ") + authorName[0]), "author"));
  8617.                      } else {
  8618.                          newItem.creators.push({lastName: manyAuthors[j], creatorType: "creator"}); 
  8619.                      }
  8620.                  }
  8621.                  
  8622.         } else if (fieldTitle == "Partof:") {
  8623.             
  8624.             dataTags[fieldTitle] = ("Part of " + Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '''')));
  8625.  
  8626.         } else if (fieldTitle == "OnlineFindingAid:") {
  8627.             dataTags[fieldTitle] = ("Online Finding Aid: " + xPathContent.iterateNext().textContent);    
  8628.             Zotero.debug(dataTags["OnlineFindingAid:"]);
  8629.             
  8630.         } else if (fieldTitle == "Names:")  { 
  8631.             dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  8632.             tagsContent = dataTags[fieldTitle].split(";");
  8633.             
  8634.         } else if (fieldTitle == "Topic:") {
  8635.             dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  8636.             tagsContent1 = dataTags[fieldTitle].split(", ");
  8637.             
  8638.         } else {
  8639.         
  8640.             dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  8641.         }
  8642.     }
  8643.     
  8644.     for (i = 0; i < tagsContent.length; i++) {
  8645.           tagsContent[i] = tagsContent[i].replace(/^\s*|\s*$/g, '''');
  8646.           newItem.tags[i] = tagsContent[i];
  8647.          }
  8648.          
  8649.          for (i = 0; i < tagsContent1.length; i++) {
  8650.           
  8651.           newItem.tags.push(tagsContent1[i]);
  8652.          }
  8653.              
  8654.     associateData (newItem, dataTags, "Title:", "title");
  8655.     associateData (newItem, dataTags, "Dates:", "date");
  8656.     associateData (newItem, dataTags, "Physicaldesc.:", "pages");
  8657.     associateData (newItem, dataTags, "Repository:", "repository");
  8658.     associateData (newItem, dataTags, "Scope/Content:", "abstractNote");
  8659.     associateData (newItem, dataTags, "Partof:", "series");
  8660.     associateData (newItem, dataTags, "OnlineFindingAid:", "extra");
  8661.     associateData (newItem, dataTags, "Language:", "language");
  8662.     associateData (newItem, dataTags, "RecordNo.:", "callNumber");
  8663.     
  8664.     newItem.url = doc.location.href;
  8665.     newItem.complete();
  8666. }
  8667.  
  8668. function doWeb(doc, url) {
  8669.     var namespace = doc.documentElement.namespaceURI;
  8670.     var nsResolver = namespace ? function(prefix) {
  8671.         if (prefix == ''x'') return namespace; else return null;
  8672.     } : null;
  8673.     
  8674.     var articles = new Array();
  8675.     
  8676.     if (detectWeb(doc, url) == "multiple") {
  8677.         var items = new Object();
  8678.         
  8679.         var xPathTitles = doc.evaluate(''//tr[1]/td[2][@class="datatext"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8680.         var nextTitle;
  8681.         
  8682.         var xPathLinks = doc.evaluate(''//td[1][@class="dataleft"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8683.         
  8684.         
  8685.         while (nextTitle = xPathTitles.iterateNext()) {
  8686.             items[xPathLinks.iterateNext().href] = nextTitle.textContent;    
  8687.         }
  8688.         
  8689.         items = Zotero.selectItems(items);
  8690.         for (var i in items) {
  8691.         
  8692.             articles.push(i);
  8693.         }
  8694.     } else {
  8695.         articles = [url];
  8696.     }
  8697.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  8698.     Zotero.wait();
  8699. }');
  8700.  
  8701. REPLACE INTO translators VALUES ('a29d22b3-c2e4-4cc0-ace4-6c2326144332', '1.0.0b4.r5', '', '2008-06-29 21:10:00', '0', '100', '4', 'CABI - CAB Abstracts', 'Adam Crymble', 'http://www.cabi.org/', 
  8702. 'function detectWeb(doc, url) {
  8703.     if (doc.evaluate(''//div/table/tbody/tr[1]/td/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8704.         return "multiple";
  8705.     } else if (doc.evaluate(''//span[@class="PageSubTitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8706.         return "book";
  8707.     }
  8708. }', 
  8709. '//CAB Abstracts translator. Code by Adam Crymble
  8710. //only designed for "book" entries. People, projects, sites, etc are ignored by Zotero.
  8711.  
  8712. function scrape(doc, url) {
  8713.  
  8714.     var namespace = doc.documentElement.namespaceURI;
  8715.     var nsResolver = namespace ? function(prefix) {
  8716.         if (prefix == ''x'') return namespace; else return null;
  8717.     } : null;    
  8718.     
  8719.     var newItem = new Zotero.Item("book");
  8720.  
  8721. //authors
  8722.     if (doc.evaluate(''//td[@class="smallwebtext"]/table/tbody/tr/td[1]/span[@class="MenuBar"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8723.         var xPathAuthors = doc.evaluate(''//td[@class="smallwebtext"]/table/tbody/tr/td[1]/span[@class="MenuBar"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8724.         var xPath1Count = doc.evaluate(''count (//td[@class="smallwebtext"]/table/tbody/tr/td[1]/span[@class="MenuBar"])'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8725.         var nameTest = 0;
  8726.     
  8727.         for (var j = 0; j < xPath1Count.numberValue; j++) {
  8728.             authors = xPathAuthors.iterateNext().textContent
  8729.             if (authors.match("by ")) {
  8730.                 var shortenAuthor = authors.indexOf("by ")+3;
  8731.                 
  8732.                 authors = authors.substr(shortenAuthor).split("; ");
  8733.             
  8734.                 for (var i = 0; i < authors.length; i++) {
  8735.                     
  8736.                     shortenAuthor = authors[i].indexOf(",");
  8737.                     authors[i] = (authors[i].substr(0, shortenAuthor));
  8738.                     var givenName = (authors[i].split(/\s/));
  8739.                     authors[i] = '''';
  8740.                     
  8741.                     for (var k = 0; k < givenName.length; k++) {
  8742.                         if (givenName[k].length == 1) {
  8743.                             authors[i] = (authors[i] + givenName[k] + ".");
  8744.                         } else {
  8745.                             
  8746.                             authors[i] = (authors[i] + " " + givenName[k]);
  8747.                         }
  8748.                     }
  8749.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  8750.                 }
  8751.             }
  8752.         }
  8753.     }
  8754.     
  8755. //imprint info
  8756.     var info = new Array();
  8757.     if (doc.evaluate(''//td[3]/table/tbody/tr/td[@class="MenuBar"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8758.         var xPathImprint = doc.evaluate(''//td[3]/table/tbody/tr/td[@class="MenuBar"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8759.         var imprint = xPathImprint.iterateNext().textContent.split(/\n/);
  8760.         
  8761.     
  8762.         for (var i = 0; i < imprint.length; i++) {
  8763.             imprint[i] = imprint[i].replace(/^\s*|\s*$/g, '''');
  8764.             if (imprint[i].match(/\w/)) {
  8765.                 info.push(imprint[i]);
  8766.             }
  8767.         }
  8768.     
  8769.         for (var i = 0; i < info.length; i++) {    
  8770.             if (info[i].match("pages")) {
  8771.                 var cutPages = info[i].indexOf("pages");
  8772.                 newItem.pages = info[i].substr(0, cutPages);
  8773.             } else if (info[i].match("Date:")) {
  8774.                 newItem.date = info[i].substr(10);
  8775.             } else if (info[i].match("ISBN: ")) {
  8776.                 newItem.ISBN = info[i].substr(6);
  8777.             }
  8778.         }
  8779.     }
  8780.     
  8781.     newItem.title = doc.title;
  8782.     newItem.url = doc.location.href;
  8783.  
  8784.     newItem.complete();
  8785. }
  8786.  
  8787. function doWeb(doc, url) {
  8788.     var namespace = doc.documentElement.namespaceURI;
  8789.     var nsResolver = namespace ? function(prefix) {
  8790.         if (prefix == ''x'') return namespace; else return null;
  8791.     } : null;
  8792.     
  8793.     var articles = new Array();
  8794.     
  8795.     if (detectWeb(doc, url) == "multiple") {
  8796.         var items = new Object();
  8797.         
  8798.         var titles = doc.evaluate(''//tr[1]/td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8799.         var mediaType = doc.evaluate(''//strong'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8800.         
  8801.         var dump = mediaType.iterateNext();
  8802.         
  8803.         var next_title;
  8804.         while (next_title = titles.iterateNext()) {
  8805.             items[next_title.href] = mediaType.iterateNext().textContent;
  8806.             if (items[next_title.href].match("Book")) {
  8807.                 items[next_title.href] = next_title.textContent;
  8808.             }
  8809.         }
  8810.         items = Zotero.selectItems(items);
  8811.         for (var i in items) {
  8812.             articles.push(i);
  8813.         }
  8814.     } else {
  8815.         articles = [url];
  8816.     }
  8817.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  8818.     Zotero.wait();
  8819. }');
  8820.  
  8821. REPLACE INTO translators VALUES ('a7c8b759-6f8a-4875-9d6e-cc0a99fe8f43', '1.0.0b4.r5', '', '2008-06-20 20:45:00', '0', '100', '4', 'Canadian Letters and Images', 'Adam Crymble', 'http://(www.)?canadianletters.ca/', 
  8822. 'function detectWeb(doc, url) {
  8823.     if (doc.location.href.match("results")) {
  8824.         return "multiple";
  8825.     } else if (doc.location.href.match("letters.php")) {
  8826.         return "document";
  8827.     } else if (doc.location.href.match("template")) {
  8828.         return "artwork";
  8829.     }
  8830.     
  8831. }', 
  8832. '//Translator for Canadian Letters and Images. Code by Adam Crymble
  8833.  
  8834.  
  8835. function scrape(doc, url) {
  8836.  
  8837.     var namespace = doc.documentElement.namespaceURI;
  8838.     var nsResolver = namespace ? function(prefix) {
  8839.         if (prefix == ''x'') return namespace; else return null;
  8840.     } : null;    
  8841.     
  8842.     var dataTags = new Object();
  8843.     
  8844.     var mediaType = (detectWeb(doc, url));
  8845.     if (mediaType == "document") {
  8846.         var newItem = new Zotero.Item("letter");
  8847.         var title2;
  8848.         
  8849.         //title
  8850.         if (doc.evaluate(''//h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8851.             newItem.title = doc.evaluate(''//h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8852.         } else {
  8853.             newItem.title = doc.title;
  8854.         }
  8855.     
  8856.         //letter, diary, memoir, personal item
  8857.         if (doc.evaluate(''//div[@id="collectionCategory_letters"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8858.         
  8859.             var xPathType = doc.evaluate(''//div[@id="collectionCategory_letters"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8860.             newItem.type = xPathType;
  8861.         }
  8862.         
  8863.         //gets date, to and from
  8864.         if (doc.evaluate(''//div[@class="letterInfo_label"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8865.             var xPathHeaders = doc.evaluate(''//div[@class="letterInfo_label"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8866.             var xPathContent = doc.evaluate(''//div[@class="letterInfo_title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8867.             var xPathCount = doc.evaluate(''count (//div[@class="letterInfo_label"])'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8868.             
  8869.             for (i=0; i<xPathCount.numberValue; i++) {    
  8870.                 fieldTitle=xPathHeaders.iterateNext().textContent.replace(/\s+/g, '''');
  8871.                 dataTags[fieldTitle] = xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  8872.                 
  8873.                 if (fieldTitle == "To:") {
  8874.                     
  8875.                     newItem.abstractNote = ("To: " + dataTags[fieldTitle]);
  8876.                     
  8877.                 } else if (fieldTitle == "From:") {
  8878.                 
  8879.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags[fieldTitle], "author"));
  8880.                     
  8881.                 } else if (fieldTitle == "Date:") {
  8882.                     
  8883.                     newItem.date = dataTags[fieldTitle];
  8884.                 }    
  8885.             }        
  8886.         }
  8887.     } else if (mediaType == "artwork") {
  8888.         
  8889.         newItem = new Zotero.Item("artwork");
  8890.         
  8891.         if (doc.evaluate(''//div[@class="pictureDisplay"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8892.             newItem.title = doc.evaluate(''//div[@class="pictureDisplay"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8893.         } else {
  8894.             newItem.title = doc.title;
  8895.         }        
  8896.     }
  8897.     
  8898.     
  8899.         
  8900.     newItem.url = doc.location.href;
  8901.  
  8902.     newItem.complete();
  8903. }
  8904.  
  8905. function doWeb(doc, url) {
  8906.     var namespace = doc.documentElement.namespaceURI;
  8907.     var nsResolver = namespace ? function(prefix) {
  8908.         if (prefix == ''x'') return namespace; else return null;
  8909.     } : null;
  8910.     
  8911.     var articles = new Array();
  8912.     
  8913.     if (detectWeb(doc, url) == "multiple") {
  8914.         var items = new Object();
  8915.         
  8916.         var titles = doc.evaluate(''//div[@class="searchResultsDisplay"]/div/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  8917.         
  8918.         var next_title;
  8919.         while (next_title = titles.iterateNext()) {
  8920.             items[next_title.href] = next_title.textContent;
  8921.         }
  8922.         items = Zotero.selectItems(items);
  8923.         for (var i in items) {
  8924.             articles.push(i);
  8925.         }
  8926.     } else {
  8927.         articles = [url];
  8928.     }
  8929.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  8930.     Zotero.wait();
  8931. }');
  8932.  
  8933. REPLACE INTO translators VALUES ('3f44a651-8b6b-4591-8ca4-4bfb943a13f4', '1.0.0b4.r5', '', '2008-06-20 20:45:00', '0', '100', '4', 'Edutopia', 'Adam Crymble', 'http://www.edutopia.org', 
  8934. 'function detectWeb(doc, url) {
  8935.     
  8936.     var blog1 = 0;
  8937.     
  8938.     if (doc.title.match("blog")) {
  8939.         blog1 = 1;
  8940.     }
  8941.     
  8942.     if (doc.location.href.match("search")) {
  8943.         return "multiple";
  8944.     } else if (blog1 == 0 && doc.evaluate(''//h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8945.         return "newspaperArticle";
  8946.     }
  8947. }', 
  8948. '//Edutopia.org translator. Code by Adam Crymble
  8949.  
  8950. function associateMeta(newItem, metaTags, field, zoteroField) {
  8951.     if(metaTags[field]) {
  8952.         newItem[zoteroField] = metaTags[field];
  8953.     }
  8954. }
  8955.  
  8956. function scrape(doc, url) {
  8957.  
  8958.     var namespace = doc.documentElement.namespaceURI;
  8959.     var nsResolver = namespace ? function(prefix) {
  8960.         if (prefix == ''x'') return namespace; else return null;
  8961.     } : null;    
  8962.  
  8963.     var author;
  8964.     var authorCheck = 0;
  8965.     var tagsContent = new Array();
  8966.     
  8967.     var newItem = new Zotero.Item("newspaperArticle");
  8968.     
  8969. //title    
  8970.     var title1 = doc.title.split("|");
  8971.     newItem.title = title1[0];
  8972.     
  8973. //author    
  8974.     if (doc.evaluate(''//div[@id="article"]/h4/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8975.         
  8976.         author = doc.evaluate(''//div[@id="article"]/h4/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8977.         authorCheck = 1;
  8978.         
  8979.     } else if (doc.evaluate(''//div[@id="pollpage"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8980.     
  8981.         author = doc.evaluate(''//div[@id="pollpage"]/p/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8982.         authorCheck = 1;
  8983.         
  8984.     } else if (doc.evaluate(''//div[@class="blog"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  8985.         
  8986.         author = doc.evaluate(''//div[@class="blog"]/h4'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8987.         authorCheck = 1;
  8988.     }
  8989.     
  8990.     if (authorCheck == 1) {
  8991.         if (author.toLowerCase().match(/^by /)) {
  8992.             author = author.substr(3);
  8993.         }
  8994.         Zotero.debug(author);
  8995.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  8996.     }
  8997.     
  8998.     
  8999. //abstract    
  9000.     if (doc.evaluate(''//div[@class="dek"]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  9001.         newItem.abstractNote = (doc.evaluate(''//div[@class="dek"]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  9002.     }
  9003.     
  9004. //date
  9005.     if (doc.evaluate(''/span[@class="blog_date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  9006.         newItem.date = doc.evaluate(''/span[@class="blog_date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  9007.     }
  9008.     
  9009.     var metaTags = new Object();
  9010.     
  9011.     var metaTagHTML = doc.getElementsByTagName("meta");
  9012.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  9013.         metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  9014.     }
  9015.     
  9016.     if (metaTags["keywords"]) {
  9017.         tagsContent = (metaTags["keywords"].split('', ''));        
  9018.     }
  9019.     
  9020.     for (var i = 0; i < tagsContent.length; i++) {
  9021.              newItem.tags[i] = tagsContent[i];
  9022.          }
  9023.  
  9024.     associateMeta (newItem, metaTags, "description", "abstractNote");
  9025.     
  9026.     newItem.publication = "Edutopia.org"
  9027.     newItem.url = doc.location.href;
  9028.  
  9029.     newItem.complete();
  9030. }
  9031.  
  9032. function doWeb(doc, url) {
  9033.     var namespace = doc.documentElement.namespaceURI;
  9034.     var nsResolver = namespace ? function(prefix) {
  9035.         if (prefix == ''x'') return namespace; else return null;
  9036.     } : null;
  9037.     
  9038.     var articles = new Array();
  9039.     
  9040.     if (detectWeb(doc, url) == "multiple") {
  9041.         var items = new Object();        
  9042.         
  9043.         var titles = doc.evaluate(''//dt[@class="title"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9044.         
  9045.         var next_title;
  9046.         while (next_title = titles.iterateNext()) {
  9047.             items[next_title.href] = next_title.textContent;
  9048.         }
  9049.         items = Zotero.selectItems(items);
  9050.         for (var i in items) {
  9051.             articles.push(i);
  9052.         }
  9053.     } else {
  9054.         articles = [url];
  9055.     }
  9056.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  9057.     Zotero.wait();
  9058. }');
  9059.  
  9060. REPLACE INTO translators VALUES ('18bc329c-51af-497e-a7cf-aa572fae363d', '1.0.0b4.r5', '', '2008-06-20 20:45:00', '0', '100', '4', 'Archives Canada', 'Adam Crymble', 'http://(www.)?archivescanada.ca', 
  9061. 'function detectWeb (doc, url) {
  9062.     if (doc.location.href.match("RouteRqst")) {
  9063.         return "multiple";
  9064.     } else if (doc.location.href.match("ItemDisplay")) {
  9065.         return "book";
  9066.     }    
  9067. }', 
  9068. 'function associateData (newItem, dataTags, field, zoteroField) {
  9069.     if (dataTags[field]) {
  9070.         newItem[zoteroField] = dataTags[field];
  9071.     }
  9072. }
  9073.  
  9074. function scrape(doc, url) {
  9075.     var namespace = doc.documentElement.namespaceURI;
  9076.     var nsResolver = namespace ? function(prefix) {
  9077.         if (prefix == ''x'') return namespace; else return null;
  9078.     } : null;
  9079.     
  9080.     var dataTags = new Object();
  9081.     var tagsContent = new Array();
  9082.     var cainNo;
  9083.     var newItem = new Zotero.Item("book");
  9084.  
  9085.     var data = doc.evaluate(''//td/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9086.     var dataCount = doc.evaluate(''count (//td/p)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9087.  
  9088.     for (i=0; i<dataCount.numberValue; i++) {         
  9089.              data1 = data.iterateNext().textContent.replace(/^\s*|\s*$/g, '''').split(":");
  9090.              fieldTitle = data1[0].replace(/\s+/g, '''');
  9091.  
  9092.              if (fieldTitle == "PROVENANCE") {
  9093.                  
  9094.                  var multiAuthors = data1[1].split(/\n/);
  9095.                  
  9096.                  for (var j = 0; j < multiAuthors.length; j++) {
  9097.                      if (multiAuthors[j].match(",")) {
  9098.                          
  9099.                          var authorName = multiAuthors[j].replace(/^\s*|\s*$/g, '''').split(",");
  9100.                      
  9101.                          authorName[0] = authorName[0].replace(/\s+/g, '''');
  9102.                          dataTags["PROVENANCE"] = (authorName[1] + (" ") + authorName[0]);
  9103.                          newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["PROVENANCE"], "author"));     
  9104.          
  9105.                      } else {    
  9106.                      
  9107.                          newItem.creators.push({lastName: multiAuthors[j].replace(/^\s*|\s*$/g, ''''), creatorType: "creator"});
  9108.                      }
  9109.                  }         
  9110.                  
  9111.              } else if (fieldTitle == "SUBJECTS" | fieldTitle == "MATI├êRES") {
  9112.                  tagsContent = data1[1].split(/\n/);
  9113.                               
  9114.              } else {
  9115.              
  9116.                  dataTags[fieldTitle] = data1[1];
  9117.              }
  9118.          }
  9119.          
  9120.          if (doc.evaluate(''//tr[3]/td/table/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr/td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  9121.              cainNo = doc.evaluate(''//tr[3]/td/table/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr/td[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  9122.              newItem.extra = cainNo.replace(/^\s*|\s*$/g, '''');
  9123.          }
  9124.              for (var i = 0; i < tagsContent.length; i++) {
  9125.                  newItem.tags[i] = tagsContent[i].replace(/^\s*|\s*$/g, '''');
  9126.              }
  9127.              
  9128.          associateData (newItem, dataTags, "TITLE", "title" );
  9129.          associateData (newItem, dataTags, "REPOSITORY", "repository" );
  9130.          associateData (newItem, dataTags, "RETRIEVALNUMBER", "callNumber" );
  9131.          associateData (newItem, dataTags, "DATES", "date" );
  9132.          associateData (newItem, dataTags, "SCOPEANDCONTENT", "abstractNote" );
  9133.          associateData (newItem, dataTags, "LANGUAGE", "language" );
  9134.          
  9135.          associateData (newItem, dataTags, "LANGUE", "language" );
  9136.          associateData (newItem, dataTags, "TITRE", "title" );
  9137.          associateData (newItem, dataTags, "CENTRED''ARCHIVES", "repository" );
  9138.          associateData (newItem, dataTags, "NUM├ëROD''EXTRACTION", "callNumber" );
  9139.          associateData (newItem, dataTags, "PORT├ëEETCONTENU", "abstractNote" );
  9140.     
  9141.     newItem.url = doc.location.href;
  9142.  
  9143.     newItem.complete();
  9144. }
  9145.  
  9146. function doWeb(doc, url) {
  9147.     var namespace = doc.documentElement.namespaceURI;
  9148.     var nsResolver = namespace ? function(prefix) {
  9149.         if (prefix == ''x'') return namespace; else return null;
  9150.     } : null;
  9151.     
  9152.     var articles = new Array();
  9153.     
  9154.     if (detectWeb(doc, url) == "multiple") {
  9155.         var items = new Object();
  9156.         
  9157.         var titles = doc.evaluate(''//td[3]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9158.  
  9159.         var next_title;
  9160.         while (next_title = titles.iterateNext()) {
  9161.             items[next_title.href] = next_title.textContent;
  9162.         }
  9163.         items = Zotero.selectItems(items);
  9164.         for (var i in items) {
  9165.             articles.push(i);
  9166.         }
  9167.     } else {
  9168.         articles = [url];
  9169.     }
  9170.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  9171.     Zotero.wait();
  9172. }');
  9173.  
  9174. REPLACE INTO translators VALUES ('c76d6c19-b4c6-4e51-bd7a-0a81752305ae', '1.0.0b4.r5', '', '2008-06-20 20:45:00', '0', '100', '4', 'BC Archival Information Network', 'Adam Crymble', 'http://(mayne.)?aabc.bc.ca/', 
  9175. 'function detectWeb(doc, url) {
  9176.     var namespace = doc.documentElement.namespaceURI;
  9177.     var nsResolver = namespace ? function(prefix) {
  9178.         if (prefix == ''x'') return namespace; else return null;
  9179.     } : null;
  9180.     
  9181.     
  9182.     var entryType = (doc.evaluate(''/html/body/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null));
  9183.     if (entryType.iterateNext()) {
  9184.         var entryType1 = entryType.iterateNext().textContent;
  9185.     
  9186.         if (entryType1.match("Search") && entryType1 != ("Search Results - BCAUL Repositories")) {
  9187.             return "multiple";
  9188.         } else if (entryType1.match("Display") && entryType1 != ("Display - BCAUL Repositories") && doc.location.href.match("display")) {
  9189.             return "book";
  9190.         }
  9191.     }
  9192. }', 
  9193. '//BCAIN translator. Code by Adam Crymble
  9194.  
  9195. function associateData (newItem, dataTags, field, zoteroField) {
  9196.     if (dataTags[field]) {
  9197.         newItem[zoteroField] = dataTags[field];
  9198.     }
  9199. }
  9200.  
  9201. function scrape(doc, url) {
  9202.     var namespace = doc.documentElement.namespaceURI;
  9203.     var nsResolver = namespace ? function(prefix) {
  9204.         if (prefix == ''x'') return namespace; else return null;
  9205.     } : null;
  9206.     
  9207.     var newItem = new Zotero.Item("book");
  9208.     
  9209.     var dataTags = new Object();
  9210.     var manyAuthors = new Array();
  9211.     var tagsContent = new Array();
  9212.     
  9213.     var xPathHeaders = doc.evaluate(''//td[1][@class="datalabel"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9214.     var xPathContent = doc.evaluate(''//td[2][@class="datatext"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9215.     var xPathCount = doc.evaluate(''count (//td[1][@class="datalabel"])'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9216.     
  9217.     Zotero.debug(xPathCount.numberValue);
  9218.     
  9219.     for (var i = 0; i < xPathCount.numberValue; i++) {
  9220.         fieldTitle = xPathHeaders.iterateNext().textContent.replace(/\s+/g, '''');
  9221.         
  9222.         if (fieldTitle =="Provenance:") {
  9223.                  
  9224.                  dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  9225.                  
  9226.                  if (dataTags[fieldTitle].match("; ")) {
  9227.                      manyAuthors = dataTags[fieldTitle].split("; ");
  9228.                  } else {
  9229.                      manyAuthors.push(dataTags[fieldTitle]);
  9230.                  }
  9231.                  
  9232.                  for (var j = 0; j < manyAuthors.length; j++) {
  9233.                      if (manyAuthors[j].match(", ")) {
  9234.                          var authorName = manyAuthors[j].split(",");
  9235.                          authorName[0] = authorName[0].replace(/^\s*|\s*$/g, '''');
  9236.                          newItem.creators.push(Zotero.Utilities.cleanAuthor((authorName[1] + (" ") + authorName[0]), "author"));
  9237.                      } else {
  9238.                          newItem.creators.push({lastName: dataTags["Provenance:"], creatorType: "creator"}); 
  9239.                      }
  9240.                  }
  9241.                  
  9242.         } else if (fieldTitle == "Partof:") {
  9243.             
  9244.             dataTags[fieldTitle] = ("Part of " + Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '''')));
  9245.  
  9246.         } else if (fieldTitle == "OnlineFindingAid:") {
  9247.             dataTags[fieldTitle] = ("Online Finding Aid: " + xPathContent.iterateNext().textContent);    
  9248.             Zotero.debug(dataTags["OnlineFindingAid:"]);
  9249.             
  9250.         } else if (fieldTitle == "Names:")  { 
  9251.             dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  9252.             tagsContent = dataTags[fieldTitle].split(";");
  9253.             
  9254.         } else {
  9255.         
  9256.             dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  9257.         }
  9258.     }
  9259.     
  9260.     for (var i = 0; i < tagsContent.length; i++) {
  9261.           tagsContent[i] = tagsContent[i].replace(/^\s*|\s*$/g, '''');
  9262.           newItem.tags[i] = tagsContent[i];
  9263.          }
  9264.              
  9265.     associateData (newItem, dataTags, "Title:", "title");
  9266.     associateData (newItem, dataTags, "Dates:", "date");
  9267.     associateData (newItem, dataTags, "Physicaldesc.:", "pages");
  9268.     associateData (newItem, dataTags, "Repository:", "repository");
  9269.     associateData (newItem, dataTags, "Scope/Content:", "abstractNote");
  9270.     associateData (newItem, dataTags, "Partof:", "series");
  9271.     associateData (newItem, dataTags, "OnlineFindingAid:", "extra");
  9272.     
  9273.     newItem.notes.push({title:"Title", note:"To view this entry in your browser, please go to''http://aabc.bc.ca/WWW.aabc.archbc/access'' and search for the entry Title "});
  9274.     newItem.complete();
  9275. }
  9276.  
  9277. function doWeb(doc, url) {
  9278.     var namespace = doc.documentElement.namespaceURI;
  9279.     var nsResolver = namespace ? function(prefix) {
  9280.         if (prefix == ''x'') return namespace; else return null;
  9281.     } : null;
  9282.     
  9283.     var articles = new Array();
  9284.     
  9285.     if (detectWeb(doc, url) == "multiple") {
  9286.         var items = new Object();
  9287.         
  9288.         var xPathTitles = doc.evaluate(''//tr[1]/td[2][@class="datatext"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9289.         var nextTitle;
  9290.         
  9291.         var xPathLinks = doc.evaluate(''//td[1][@class="dataleft"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9292.         var nextLink;
  9293.         
  9294.         while (nextTitle = xPathTitles.iterateNext()) {
  9295.             items[xPathLinks.iterateNext().href] = nextTitle.textContent;    
  9296.         }
  9297.         
  9298.         items = Zotero.selectItems(items);
  9299.         for (var i in items) {
  9300.             articles.push(i);
  9301.         }
  9302.     } else {
  9303.         articles = [url];
  9304.     }
  9305.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  9306.     Zotero.wait();
  9307. }');
  9308.  
  9309. REPLACE INTO translators VALUES ('59cce211-9d77-4cdd-876d-6229ea20367f', '1.0.0b4.r5', '', '2008-12-12 12:35:00', '0', '100', '4', 'Biblioth├¿que et Archives nationales du Qu├⌐bec', 'Adam Crymble', 'http://catalogue.banq.qc.ca', 
  9310. 'function detectWeb(doc, url) {
  9311.     if (doc.title.match("Search")) {
  9312.         return "multiple";
  9313.     } else if (doc.title.match("Recherche")) {
  9314.         return "multiple";
  9315.         
  9316.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("book")) {
  9317.         return "book";
  9318.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mmusic")) {
  9319.         return "book";    
  9320.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("manalytic")) {
  9321.         return "book";
  9322.         
  9323.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("msdisc")) {
  9324.         return "audioRecording";
  9325.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("msound")) {
  9326.         return "audioRecording";
  9327.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mscas")) {
  9328.         return "audioRecording";
  9329.         
  9330.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mvdisc")) {
  9331.         return "videoRecording";
  9332.     
  9333.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mpaint")) {
  9334.         return "artwork";
  9335.     
  9336.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mserial")) {
  9337.         return "report";
  9338.     
  9339.     } else if (doc.evaluate(''//td[2]/a/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mcomponent")) {
  9340.         return "newspaperArticle";
  9341.     }
  9342. }
  9343.  
  9344. ', 
  9345. '//Bibliotheque et Archives National du Quebec. Code by Adam Crymble
  9346.  
  9347. function associateData (newItem, dataTags, field, zoteroField) {
  9348.     if (dataTags[field]) {
  9349.         newItem[zoteroField] = dataTags[field];
  9350.     }
  9351. }
  9352.  
  9353. function scrape(doc, url) {
  9354.     var namespace = doc.documentElement.namespaceURI;
  9355.     var nsResolver = namespace ? function(prefix) {
  9356.         if (prefix == ''x'') return namespace; else return null;
  9357.     } : null;
  9358.     
  9359.     var dataTags = new Object();
  9360.     var fieldTitle;
  9361.     var contents;    
  9362.     var descriptionField;
  9363.     var tagsContent= new Array();
  9364.     var inField = 0;
  9365.  
  9366.     //determines media type    
  9367.     if (detectWeb(doc, url) == "book") {
  9368.         var newItem = new Zotero.Item("book");
  9369.         descriptionField = "pages";
  9370.     } else if (detectWeb(doc, url) == "audioRecording") {
  9371.         var newItem = new Zotero.Item("audioRecording");
  9372.         descriptionField = "runningTime";
  9373.     } else if (detectWeb(doc, url) == "videoRecording") {
  9374.         var newItem = new Zotero.Item("videoRecording");
  9375.         descriptionField = "runningTime";
  9376.     } else if (detectWeb(doc, url) == "artwork") {
  9377.         var newItem = new Zotero.Item("artwork");
  9378.         descriptionField = "artworkSize";
  9379.     } else if (detectWeb(doc, url) == "report") {
  9380.         var newItem = new Zotero.Item("report");
  9381.         descriptionField = "pages";
  9382.     }  else if (detectWeb(doc, url) == "newspaperArticle") {
  9383.         var newItem = new Zotero.Item("newspaperArticle");
  9384.         descriptionField = "pages"
  9385.     }
  9386.     
  9387. //determines  language    
  9388.     var lang = doc.evaluate(''//td[2]/a/img'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9389.     var langCount = doc.evaluate(''count (//td[2]/a/img)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9390.     var lang1 = lang.iterateNext().src;
  9391.     
  9392.     if (langCount.numberValue > 1) {    
  9393.         lang1 = lang.iterateNext().src;
  9394.  
  9395.         if (lang1.match("lfre")) {
  9396.             newItem.language = "French";
  9397.         } else if (lang1.match("leng")) {
  9398.             newItem.language = "English";
  9399.         }
  9400.     }
  9401.     
  9402. //scraping XPaths    
  9403.     var xPathHeadings = doc.evaluate(''//td/table/tbody/tr/td[2]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9404.     var xPathContents = doc.evaluate(''//td[2]/table/tbody/tr/td/table/tbody/tr/td[4]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9405.     var xPathCount = doc.evaluate(''count (//td/table/tbody/tr/td[2]/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9406.     
  9407.     if (doc.evaluate(''//td/table/tbody/tr/td[2]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  9408.         
  9409.            for (i=0; i<xPathCount.numberValue; i++) {     
  9410.             
  9411.             fieldTitle  = xPathHeadings.iterateNext().textContent.replace(/\s+/g, '''');
  9412.             contents = xPathContents.iterateNext().textContent;
  9413.             
  9414.             if (contents.match("[*]") && fieldTitle!= "Publisher" && fieldTitle!= "├ëditeur") {
  9415.                 var removeTagExcess = contents.indexOf("[");
  9416.                 contents = contents.substr(0, removeTagExcess);
  9417.             }        
  9418.             
  9419.             if (fieldTitle == "Author" | fieldTitle == "Auteur") {
  9420.                 fieldTitle = "Author";
  9421.                 dataTags[fieldTitle] = (contents);
  9422.                      var authorName = dataTags["Author"].split(",");
  9423.                      authorName[0] = authorName[0].replace(/\s+/g, '''');
  9424.         
  9425.                      dataTags["Author"] = (authorName[1] + (" ") + authorName[0]);
  9426.                      newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Author"], "author"));          
  9427.         
  9428.           //publishing info            
  9429.             } else if (fieldTitle == "Publisher" | fieldTitle == "├ëditeur") {
  9430.                 fieldTitle = "Publisher";
  9431.                 
  9432.                 dataTags["Publisher"] = (contents);
  9433.                 
  9434.                 if (dataTags["Publisher"].match(":")) {
  9435.                 
  9436.                     var place1 = dataTags["Publisher"].split(":");
  9437.                     dataTags["Place"] = place1[0].replace(/^\s*|\[|\]/g,'''');
  9438.                     
  9439.                     var publish = place1[1].split(",");
  9440.                     dataTags["Publish"] = (publish[0].replace(/^\s*|\[|\]/g,''''));
  9441.                     
  9442.                     place1[1] = place1[1].replace(/^\s*|\s*$|\[|\]/g, '''');
  9443.                     if (place1[1].match("/?")) {
  9444.                         var dateLength = place1[1].length-5;
  9445.                     } else {
  9446.                         var dateLength = place1[1].length-4;
  9447.                     }
  9448.                     dataTags["Date"] = place1[1].substr(dateLength);
  9449.                 } else {
  9450.                     dataTags["Date"] = (contents);
  9451.                 }
  9452.             
  9453.         //tags        
  9454.             } else if (fieldTitle == "Subjects" | fieldTitle == "Sujets") {
  9455.                      fieldTitle = "Subjects";
  9456.                      tagsContent = contents.split("\n");
  9457.         
  9458.         //source    
  9459.             } else  if (fieldTitle == "Source") {
  9460.                 dataTags[fieldTitle] = (contents.replace(/^\s*|\s*$/g, ''''));
  9461.                 dataTags["Source"] = ("Source: " + dataTags["Source"]);
  9462.                 Zotero.debug(doc.title);      
  9463.         //normal                             
  9464.             } else {
  9465.                 dataTags[fieldTitle] = (contents.replace(/^\s*|\s*$/g, ''''));    
  9466.             }    
  9467.         }
  9468.     
  9469.     //series    
  9470.         if (fieldTitle == "Series" | fieldTitle == "Collection") {
  9471.             fieldTitle = "Series";
  9472.             dataTags[fieldTitle] = (contents.replace(/\s\s\s*/g, ''''));
  9473.         }
  9474.             
  9475.     //makes tags    
  9476.         for (i = 0; i < tagsContent.length; i++) {
  9477.             if (tagsContent[i] != ("") && tagsContent[i] !=(" ")) {                            
  9478.                 newItem.tags[i] = tagsContent[i];
  9479.             } 
  9480.              }
  9481.             
  9482.     associateData (newItem, dataTags, "Description", descriptionField);
  9483.             
  9484.     associateData (newItem, dataTags, "Title", "title");
  9485.     associateData (newItem, dataTags, "Place", "place");
  9486.     associateData (newItem, dataTags, "Publish", "publisher");
  9487.     associateData (newItem, dataTags, "Date", "date");
  9488.     associateData (newItem, dataTags, "Source", "extra");
  9489.     associateData (newItem, dataTags, "ISBN", "ISBN");
  9490.     associateData (newItem, dataTags, "Localinf.", "rights");
  9491.     associateData (newItem, dataTags, "Series", "series");
  9492.     associateData (newItem, dataTags, "Notes", "abstractNote");
  9493.     associateData (newItem, dataTags, "Numbering", "reportNumber");
  9494.     
  9495.     associateData (newItem, dataTags, "Titre", "title");
  9496.     associateData (newItem, dataTags, "Num├⌐rotation", "reportNumber");
  9497.     
  9498.     }
  9499.     
  9500.     newItem.url = doc.location.href;
  9501.     newItem.complete();    
  9502. }
  9503.  
  9504. function doWeb(doc, url) {
  9505.     var namespace = doc.documentElement.namespaceURI;
  9506.     var nsResolver = namespace ? function(prefix) {
  9507.         if (prefix == ''x'') return namespace; else return null;
  9508.     } : null;
  9509.     
  9510.     var articles = new Array();
  9511.     
  9512.     if (detectWeb(doc, url) == "multiple") {
  9513.         var items = new Object();
  9514.         var next_title = new Array();
  9515.         var links1 = new Array();
  9516.         var y = 0;
  9517.         var next_title1 = new Array();
  9518.         
  9519.         var titlesCount = doc.evaluate(''count (//p/table/tbody/tr/td/b)'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9520.         var numAndTitle= doc.evaluate(''//p/table/tbody/tr/td/b'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9521.         var links = doc.evaluate(''//p/table/tbody/tr/td/a[img]'', doc, nsResolver, XPathResult.ANY_TYPE, null);        
  9522.         var multipleTest = 0;
  9523.         
  9524.         for (j=0; j < titlesCount.numberValue; j++) {
  9525.             
  9526.             next_title[j] = numAndTitle.iterateNext().textContent;
  9527.             next_title[j] = next_title[j].substr(0, next_title[j].length-1);
  9528.         
  9529.             if (/^\d*$/.test(next_title[j])) {
  9530.                 multipleTest = 0;
  9531.             } else if (multipleTest < 1) {
  9532.                 multipleTest++;
  9533.                 next_title1[y] = next_title[j];
  9534.                  y++;
  9535.                  Zotero.debug(next_title1[0]);
  9536.                 
  9537.             } else if (multipleTest > 1) {
  9538.                 multipleTest = 0;
  9539.             }
  9540.         }
  9541.         
  9542.         for (j = 0; j < 10; j++) {
  9543.                 links1[j] = links.iterateNext().href;
  9544.                 //Zotero.debug(links1[0]);
  9545.                 items[links1] = next_title1[j];
  9546.         }
  9547.         
  9548.         
  9549.         items = Zotero.selectItems(items);
  9550.         for (var i in items) {
  9551.             articles.push(i);
  9552.         }
  9553.     } else {
  9554.         articles = [url];
  9555.     }
  9556.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  9557.     Zotero.wait();
  9558.     
  9559. }');
  9560.  
  9561. REPLACE INTO translators VALUES ('2d174277-7651-458f-86dd-20e168d2f1f3', '1.0.0b4.r5', '', '2008-06-12 19:30:00', '0', '100', '4', 'Canadiana.org', 'Adam Crymble', 'http://(www.)?canadiana.org', 
  9562. 'function detectWeb(doc, url) {
  9563.    
  9564.    //checks the title of the webpage. If it matches, then the little blue book symbol appears in the address bar.
  9565.    //works for English and French versions of the page.
  9566.     
  9567.         if(doc.title == "Early Canadiana Online - Item Record"|doc.title == "Notre m├⌐moire en ligne - Notice") {
  9568.             return "book";
  9569.     } else if (doc.evaluate(''//div[@id="Content"]/div[@class="NormalRecord"]/h3/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  9570.         return  "multiple";
  9571.     }
  9572. }
  9573.  
  9574. ', 
  9575. '//Canadiana Translator Coding by Adam Crymble
  9576. //because the site uses so many random formats for the "Imprint" field, it''s not always perfect. But it works for MOST entries
  9577.  
  9578. function associateData (newItem, dataTags, field, zoteroField) {
  9579.     if (dataTags[field]) {
  9580.         newItem[zoteroField] = dataTags[field];
  9581.     }
  9582. }
  9583.  
  9584. function scrape(doc, url) {
  9585.     var namespace = doc.documentElement.namespaceURI;
  9586.     var nsResolver = namespace ? function(prefix) {
  9587.         if (prefix == "x" ) return namespace; else return null;
  9588.     } : null;
  9589.             
  9590.            //declaring variables to be used later.
  9591.     var newItem = new Zotero.Item("book");
  9592.     newItem.url = doc.location.href;
  9593.     
  9594.     var dataTags = new Object();
  9595.     var fieldTitle;
  9596.     var tagsContent= new Array();
  9597.         
  9598.         //these variables tell the program where to find the data we want in the HTML file we''re looking at.
  9599.         //in this case, the data is found in a table.
  9600.         var xPath1 = ''//tr/td[1][@class="Label"]'';
  9601.         var xPath2 = ''//tr/td[2]'';
  9602.        
  9603.       
  9604.        //at this point, all the data we want has been saved into the following 2 Objects: one for the headings, one for the content.
  9605.        // The 3rd object tells us how many items we''ve found.
  9606.        if (doc.evaluate(''//tr/td[1][@class="Label"]'', doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  9607.                 var xPath1Results = doc.evaluate(xPath1, doc, nsResolver, XPathResult.ANY_TYPE, null);
  9608.                 var xPath2Results = doc.evaluate(xPath2, doc, nsResolver, XPathResult.ANY_TYPE, null);
  9609.                 var xPathCount = doc.evaluate( ''count (//tr/td[1][@class="Label"])'', doc, nsResolver, XPathResult.ANY_TYPE, null);           
  9610.       }  
  9611.   
  9612.       //At this point we have two lists (xPath1Results and xPath2Results). this loop matches the first item in the first list
  9613.       //with the first item in the second list, and on until the end. 
  9614.       //If we then ask for the "Principal Author" the program returns "J.K. Rowling" instead of "Principal Author"
  9615.        if (doc.evaluate(''//tr/td[1][@class="Label"]'', doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  9616.            for (i=0; i<xPathCount.numberValue; i++) {         
  9617.                      
  9618.                  fieldTitle=xPath1Results.iterateNext().textContent.replace(/\s+/g, '''');
  9619.                  
  9620.                      //gets the author''s name without cleaning it away using cleanTags.
  9621.                  if (fieldTitle =="PrincipalAuthor:" || fieldTitle == "Auteurprincipal:") {
  9622.                      
  9623.                      fieldTitle="PrincipalAuthor:";
  9624.                      dataTags[fieldTitle]=(xPath2Results.iterateNext().textContent);
  9625.                      var authorName =dataTags["PrincipalAuthor:"].split(",");
  9626.                      authorName[0]=authorName[0].replace(/\s+/g, '''');
  9627.                      dataTags["PrincipalAuthor:"]= (authorName[1] + (" ") + authorName[0]);
  9628.                      newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["PrincipalAuthor:"], "author"));
  9629.                  
  9630.                      //Splits Adressebibliographique or Imprint into 3 fields and cleans away any extra whitespace or unwanted characters.              
  9631.                  } else if (fieldTitle =="Adressebibliographique:" || fieldTitle == "Imprint:") {
  9632.                           
  9633.                           fieldTitle = "Imprint:";
  9634.                           dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent);
  9635.                           
  9636.                           var separateImprint = dataTags["Imprint:"].split(":");
  9637.                           separateImprint[0]= separateImprint[0].replace(/^\s*|\[|\]/g,'''');
  9638.                      dataTags["Place:"]=separateImprint[0];
  9639.                      
  9640.                      var justDate = separateImprint[1].replace(/\D/g, '''');
  9641.                      dataTags["Date:"]= justDate;
  9642.                      
  9643.                      separateImprint[1] = separateImprint[1].replace(/\d|\[|\]|\./g, '''');
  9644.                      separateImprint[1] = separateImprint[1].replace(/^\s*|\s*$/g, '''');
  9645.                      dataTags["Publisher:"]= separateImprint[1];
  9646.                      
  9647.                      // determines how many tags there will be, pushes them into an array and clears away whitespace.
  9648.                  } else if (fieldTitle == "Subject:" || fieldTitle == "Sujet:") {
  9649.                      
  9650.                      tagsContent.push(Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent.replace(/^\s*|\s*$/g, '''')));
  9651.                      while (fieldTitle != "Collection:") {
  9652.                          i=i+1;
  9653.                          tagsContent.push(Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent.replace(/^\s*|\s*$/g, '''')));
  9654.                          fieldTitle=xPath1Results.iterateNext().textContent.replace(/\s+/g, '''');
  9655.                      }
  9656.         
  9657.                  } else {
  9658.                      
  9659.                      dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent.replace(/^\s*|\s*$/g, ''''));
  9660.                  
  9661.                  }
  9662.              }
  9663.          }
  9664.              //Adds a string to CIHM no: and ICMH no: so that the resulting number makes sense to the reader.
  9665.              if (dataTags["CIHMno.:"]) {
  9666.                  
  9667.                  dataTags["CIHMno.:"]=("CIHM Number: " + dataTags["CIHMno.:"]);
  9668.              }
  9669.              
  9670.              if (dataTags["ICMHno:"]) {
  9671.                  
  9672.                  dataTags["ICMHno:"]=("ICMH nombre: " + dataTags["ICMHno:"]);
  9673.              }
  9674.              
  9675.              //makes tags of the items in the "tagsContent" array.
  9676.              for (var i = 0; i < tagsContent.length; i++) {
  9677.                  newItem.tags[i] = tagsContent[i];
  9678.              }
  9679.          
  9680.          //calls the associateData function to put the data in the correct Zotero field.    
  9681.     associateData (newItem, dataTags, "Title:", "title");
  9682.     associateData (newItem, dataTags, "Place:", "place");
  9683.          associateData (newItem, dataTags, "Publisher:", "publisher");
  9684.          associateData (newItem, dataTags, "Date:", "date");            
  9685.     associateData (newItem, dataTags, "PageCount:", "pages");
  9686.     associateData (newItem, dataTags, "CIHMno.:", "extra");
  9687.     associateData (newItem, dataTags, "DocumentSource:", "rights");
  9688.     
  9689.     associateData (newItem, dataTags, "Titre:", "title" );
  9690.     associateData (newItem, dataTags, "Nombredepages:", "pages");
  9691.     associateData (newItem, dataTags, "ICMHno:", "extra");
  9692.     associateData (newItem, dataTags, "Documentoriginal:", "rights");
  9693.     
  9694.     //Saves everything to Zotero.    
  9695.     newItem.complete();
  9696.  
  9697. }
  9698.  
  9699.  
  9700. function doWeb(doc, url) {
  9701.     var namespace = doc.documentElement.namespaceURI;
  9702.     var nsResolver = namespace ? function(prefix) {
  9703.         if (prefix == ''x'') return namespace; else return null;
  9704.     } : null;
  9705.     
  9706.     var articles = new Array();
  9707.     
  9708.     if (detectWeb(doc, url) == "multiple") {
  9709.         var items = new Object();
  9710.         var titles = doc.evaluate(''//div[@id="Content"]/div[@class="NormalRecord"]/h3/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9711.         var next_title;
  9712.         while (next_title = titles.iterateNext()) {
  9713.             items[next_title.href] = next_title.textContent;
  9714.         }
  9715.         items = Zotero.selectItems(items);
  9716.         for (var i in items) {
  9717.             articles.push(i);
  9718.         }
  9719.     } else {
  9720.         articles = [url];
  9721.     }
  9722.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  9723.     Zotero.wait();
  9724.     
  9725.     
  9726.     
  9727. }');
  9728.  
  9729. REPLACE INTO translators VALUES ('1f245496-4c1b-406a-8641-d286b3888231', '1.0.0b4.r5', '', '2008-06-06 08:45:00', '0', '100', '4', 'The Boston Globe', 'Adam Crymble', 'http://(www|search).boston.com/', 
  9730. 'function detectWeb(doc, url) {
  9731.     if (url.match("search.boston.com")) {
  9732.         return "multiple";
  9733.     } else if (doc.evaluate(''//div[@id="headTools"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  9734.         return "newspaperArticle";
  9735.     } else if (doc.evaluate(''//div[@id="blogEntry"]/h1/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  9736.         return "blogPost";
  9737.     } 
  9738. }', 
  9739. '//Boston Globe and Boston.com Translator. Code by Adam Crymble
  9740.  
  9741. function scrape (doc, url) {
  9742.     var namespace = doc.documentElement.namespaceURI;
  9743.     var nsResolver = namespace ? function(prefix) {
  9744.     }: null;
  9745.         
  9746.     //sets variables that remain constant in both formats
  9747.                     
  9748.         if (doc.evaluate(''//span[@id="dateline"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext())  {
  9749.             var xPathDateResults = doc.evaluate (''//span[@id="dateline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);    
  9750.         }
  9751.         
  9752.         if (doc.evaluate(''//span[@id="byline"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext())  {
  9753.             var xPathAuthorResults= doc.evaluate (''//span[@id="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9754.         }    
  9755.         
  9756.     
  9757.     //sets variables unique to the blog posts on Boston.com        
  9758.     
  9759.         if (doc.evaluate(''//div[@id="blogEntry"]/h1/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  9760.             
  9761.             var newItem =new Zotero.Item("blogPost");
  9762.             newItem.publicationTitle = "Boston.com";
  9763.             
  9764.             //title
  9765.             var xPathTitle = ''//div[@id="blogEntry"]/h1/a'';
  9766.             
  9767.             //date
  9768.             var articleDate = xPathDateResults.iterateNext().textContent;
  9769.             newItem.date = articleDate;
  9770.             
  9771.             //author
  9772.             var articleAuthor = xPathAuthorResults.iterateNext().textContent.replace(/Posted by /i, '''');
  9773.             articleAuthor = articleAuthor.split('','');
  9774.             var authorName = articleAuthor[0].split("and ");
  9775.     
  9776.     //else it sets the variables unique to the articles on the Boston Globe    
  9777.     
  9778.         } else if (doc.evaluate(''//div[@id="headTools"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext())  {
  9779.             
  9780.             var newItem = new Zotero.Item("newspaperArticle");
  9781.             newItem.publicationTitle = "The Boston Globe";
  9782.         
  9783.             //title
  9784.             var xPathTitle = ''//div[@id="headTools"]/h1'';
  9785.             
  9786.             //date
  9787.             if (doc.evaluate(''//span[@id="dateline"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext())  {
  9788.                 var articleDate = xPathDateResults.iterateNext().textContent;
  9789.                 if (articleDate.match(''/'')) {
  9790.                     articleDate = articleDate.split(''/'');
  9791.                 newItem.date = articleDate[1];    
  9792.                 } else {
  9793.                     newItem.date = articleDate;
  9794.                 }
  9795.                 
  9796.             }            
  9797.             
  9798.             //author(s)
  9799.                 var articleAuthor = xPathAuthorResults.iterateNext().textContent.replace(/^\s*|\s*$/g, '''');
  9800.                 articleAuthor= articleAuthor.substr(3);
  9801.                 var authorName = articleAuthor.split("and ");
  9802.             
  9803.             
  9804.             //byline    
  9805.             if (doc.evaluate(''//div[@id="headTools"]/h2'', doc, null, XPathResult.ANY_TYPE, null).iterateNext())  {        
  9806.                 newItem.abstractNote = doc.evaluate (''//div[@id="headTools"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  9807.             }
  9808.         }
  9809.             
  9810.         //creates title using xPaths defined above
  9811.             var xPathTitleResults = doc.evaluate (xPathTitle, doc, nsResolver, XPathResult.ANY_TYPE, null);
  9812.             newItem.title = xPathTitleResults.iterateNext().textContent;
  9813.         
  9814.         //pushes author(s)    
  9815.             
  9816.             for (var i=0; i<authorName.length; i++) {
  9817.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authorName[i], "author"));
  9818.             }    
  9819.         
  9820.         newItem.url = doc.location.href;
  9821.             
  9822.         newItem.complete();
  9823. }
  9824.  
  9825.  
  9826. function doWeb (doc, url) {
  9827.     var namespace = doc.documentElement.namespaceURI;
  9828.     var nsResolver = namespace ? function(prefix) {
  9829.     }: null;
  9830.     
  9831.     var uris= new Array();
  9832.  
  9833.     if (detectWeb(doc, url) == "multiple") {
  9834.         var items = new Object();
  9835.         var result =  doc.evaluate(''//div[@class="regTZ"]/a[@class="titleLink"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  9836.         var elmt = result.iterateNext();
  9837.         Zotero.debug(elmt);
  9838.         while (elmt) {
  9839.             //items.push(elmt.href);
  9840.             items[elmt.href] = elmt.textContent;
  9841.             elmt = result.iterateNext();
  9842.         }
  9843.         
  9844.         items = Zotero.selectItems(items);
  9845.         
  9846.         if (!items) {
  9847.             return true;
  9848.         }
  9849.         
  9850.         for (var i in items) {
  9851.             uris.push(i);
  9852.         }
  9853.     } else
  9854.         uris.push(url);
  9855.         Zotero.debug(uris);
  9856.     Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();});
  9857.     Zotero.wait();
  9858. }');
  9859.  
  9860. REPLACE INTO translators VALUES ('91acf493-0de7-4473-8b62-89fd141e6c74', '1.0.0b3.r1', '', '2008-06-12 19:00:00', '1', '100', '1', 'MAB2', 'Simon Kornblith. Adaptions for MAB2: Leon Krauthausen (FUB)', 'mab2', 
  9861. 'function detectImport() {
  9862.     var mab2RecordRegexp = /^[0-9]{3}[a-z ]{2}[a-z ]{3}$/
  9863.     var read = Zotero.read(8);
  9864.     if(mab2RecordRegexp.test(read)) {
  9865.         return true;
  9866.     }
  9867. }', 
  9868. 'var fieldTerminator = "\x1E";
  9869. var recordTerminator = "\x1D";
  9870. var subfieldDelimiter = "\x1F";
  9871.  
  9872. /*
  9873. * CLEANING FUNCTIONS
  9874. */
  9875.  
  9876. // general purpose cleaning
  9877. function clean(value) {
  9878.     value = value.replace(/^[\s\.\,\/\:;]+/, '''');
  9879.     value = value.replace(/[\s\.\,\/\:;]+$/, '''');
  9880.     value = value.replace(/<<+/g, '''');
  9881.     value = value.replace(/>>+/g, '''');
  9882.     value = value.replace(/ +/g, '' '');
  9883.     
  9884.     var char1 = value[0];
  9885.     var char2 = value[value.length-1];
  9886.     if((char1 == "[" && char2 == "]") || (char1 == "(" && char2 == ")")) {
  9887.         // chop of extraneous characters
  9888.         return value.substr(1, value.length-2);
  9889.     }
  9890.     
  9891.     return value;
  9892. }
  9893.  
  9894. function cleanTag(value) {
  9895.     // Chop off Authority-IDs
  9896.     value = value.slice(0, value.indexOf(''|''));
  9897.     return value;
  9898. }
  9899.  
  9900. // number extraction
  9901. function pullNumber(text) {
  9902.     var pullRe = /[0-9]+/;
  9903.     var m = pullRe.exec(text);
  9904.     if(m) {
  9905.         return m[0];
  9906.     }
  9907. }
  9908.  
  9909. // ISBN extraction
  9910. function pullISBN(text) {
  9911.     var pullRe = /[0-9X\-]+/;
  9912.     var m = pullRe.exec(text);
  9913.     if(m) {
  9914.         return m[0];
  9915.     }
  9916. }
  9917.  
  9918. // corporate author extraction
  9919. function corpAuthor(author) {
  9920.     return {lastName:author, fieldMode:true};
  9921. }
  9922.  
  9923. // regular author extraction
  9924. function author(author, type, useComma) {
  9925.     return Zotero.Utilities.cleanAuthor(author, type, useComma);
  9926. }
  9927.  
  9928. // MAB2 author extraction 
  9929. // evaluates subfield $b and sets authType 
  9930. function authorMab(author, authType, useComma) {
  9931.         if(!authType) var authType=''author'';
  9932.         authType = authType.replace(''[Hrsg.]'', ''editor'');
  9933.         authType = authType.replace(''[Mitarb.]'', ''contributor'');
  9934.         authType = authType.replace(''[├£bers.]'', ''translator'');
  9935.         return Zotero.Utilities.cleanAuthor(author, authType, useComma);
  9936. }
  9937. /*
  9938. * END CLEANING FUNCTIONS
  9939. */
  9940.  
  9941. var record = function() {
  9942.     this.directory = new Object();
  9943.     this.leader = "";
  9944.     this.content = "";
  9945.     
  9946.     // defaults
  9947.     this.indicatorLength = 2;
  9948.     this.subfieldCodeLength = 2;
  9949. }
  9950.  
  9951. // import a binary MAB2 record into this record
  9952. record.prototype.importBinary = function(record) {
  9953.     // get directory and leader
  9954.     var directory = record.substr(0, record.indexOf(fieldTerminator));
  9955.     this.leader = directory.substr(0, 24);
  9956.     var directory = directory.substr(24);
  9957.     
  9958.     // get various data
  9959.     this.indicatorLength = parseInt(this.leader[10], 10);
  9960.     this.subfieldCodeLength = parseInt(this.leader[11], 10);
  9961.     var baseAddress = parseInt(this.leader.substr(12, 5), 10);
  9962.     
  9963.     // get record data
  9964.     var contentTmp = record.substr(baseAddress);
  9965.     
  9966.     // MARC wants one-byte characters, so when we have multi-byte UTF-8
  9967.     // sequences, add null characters so that the directory shows up right. we
  9968.     // can strip the nulls later.
  9969.     this.content = "";
  9970.     for(i=0; i<contentTmp.length; i++) {
  9971.         this.content += contentTmp[i];
  9972.         if(contentTmp.charCodeAt(i) > 0x00FFFF) {
  9973.             this.content += "\x00\x00\x00";
  9974.         } else if(contentTmp.charCodeAt(i) > 0x0007FF) {
  9975.             this.content += "\x00\x00";
  9976.         } else if(contentTmp.charCodeAt(i) > 0x00007F) {
  9977.             this.content += "\x00";
  9978.         }
  9979.     }
  9980.     
  9981.     // read directory
  9982.     for(var i=0; i<directory.length; i+=12) {
  9983.         var tag = parseInt(directory.substr(i, 3), 10);
  9984.         var fieldLength = parseInt(directory.substr(i+3, 4), 10);
  9985.         var fieldPosition = parseInt(directory.substr(i+7, 5), 10);
  9986.         
  9987.         if(!this.directory[tag]) {
  9988.             this.directory[tag] = new Array();
  9989.         }
  9990.         this.directory[tag].push([fieldPosition, fieldLength]);
  9991.     }
  9992. }
  9993.  
  9994. // add a field to this record
  9995. record.prototype.addField = function(field, indicator, value) {
  9996.     field = parseInt(field, 10);
  9997.     // make sure indicator is the right length
  9998.     if(indicator.length > this.indicatorLength) {
  9999.         indicator = indicator.substr(0, this.indicatorLength);
  10000.     } else if(indicator.length != this.indicatorLength) {
  10001.         indicator = Zotero.Utilities.lpad(indicator, " ", this.indicatorLength);
  10002.     }
  10003.     
  10004.     // add terminator
  10005.     value = indicator+value+fieldTerminator;
  10006.     
  10007.     // add field to directory
  10008.     if(!this.directory[field]) {
  10009.         this.directory[field] = new Array();
  10010.     }
  10011.     this.directory[field].push([this.content.length, value.length]);
  10012.     
  10013.     // add field to record
  10014.     this.content += value;
  10015. }
  10016.  
  10017. // get all fields with a certain field number
  10018. record.prototype.getField = function(field) {
  10019.     field = parseInt(field, 10);
  10020.     var fields = new Array();
  10021.     
  10022.     // make sure fields exist
  10023.     if(!this.directory[field]) {
  10024.         return fields;
  10025.     }
  10026.     
  10027.     // get fields
  10028.     for(var i in this.directory[field]) {
  10029.         var location = this.directory[field][i];
  10030.         
  10031.         // add to array, replacing null characters
  10032.         fields.push([this.content.substr(location[0], this.indicatorLength),
  10033.                      this.content.substr(location[0]+this.indicatorLength,
  10034.                          location[1]-this.indicatorLength-1).replace(/\x00/g, "")]);
  10035.     }
  10036.     
  10037.     return fields;
  10038. }
  10039.  
  10040. // get subfields from a field
  10041. record.prototype.getFieldSubfields = function(tag) { // returns a two-dimensional array of values
  10042.     var fields = this.getField(tag);
  10043.     var returnFields = new Array();
  10044.     
  10045.     for(var i in fields) {
  10046.         returnFields[i] = new Object();
  10047.         
  10048.         var subfields = fields[i][1].split(subfieldDelimiter);
  10049.         if (subfields.length == 1) {
  10050.             returnFields[i]["?"] = fields[i][1];
  10051.         } else {
  10052.             for(var j in subfields) {
  10053.                 if(subfields[j]) {
  10054.                     var subfieldIndex = subfields[j].substr(0, this.subfieldCodeLength-1);
  10055.                     if(!returnFields[i][subfieldIndex]) {
  10056.                         returnFields[i][subfieldIndex] = subfields[j].substr(this.subfieldCodeLength-1);
  10057.                     }
  10058.                 }
  10059.             }
  10060.         }
  10061.     }
  10062.     
  10063.     return returnFields;
  10064. }
  10065.  
  10066. // add field to DB
  10067. record.prototype._associateDBField = function(item, fieldNo, part, fieldName, execMe, arg1, arg2) {
  10068.     var field = this.getFieldSubfields(fieldNo);
  10069.     Zotero.debug(''MARC: found ''+field.length+'' matches for ''+fieldNo+part);
  10070.     if(field) {
  10071.         for(var i in field) {
  10072.             var value = false;
  10073.             for(var j=0; j<part.length; j++) {
  10074.                 var myPart = part[j];
  10075.                 if(field[i][myPart]) {
  10076.                     if(value) {
  10077.                         value += " "+field[i][myPart];
  10078.                     } else {
  10079.                         value = field[i][myPart];
  10080.                     }
  10081.                 }
  10082.             }
  10083.             if(value) {
  10084.                 value = clean(value);
  10085.                 
  10086.                 if(execMe) {
  10087.                     value = execMe(value, arg1, arg2);
  10088.                 }
  10089.                 
  10090.                 if(fieldName == "creator") {
  10091.                     item.creators.push(value);
  10092.                 } else {
  10093.                     item[fieldName] = value;
  10094.                     return;
  10095.                 }
  10096.             }
  10097.         }
  10098.     }
  10099. }
  10100.  
  10101. // add field to DB as tags
  10102. record.prototype._associateTags = function(item, fieldNo, part) {
  10103.     var field = this.getFieldSubfields(fieldNo);
  10104.     for(var i in field) {
  10105.         for(var j=0; j<part.length; j++) {
  10106.             var myPart = part[j];
  10107.             if(field[i][myPart]) {
  10108.                 item.tags.push(cleanTag(field[i][myPart]));
  10109.             }
  10110.         }
  10111.     }
  10112. }
  10113.  
  10114. // this function loads a MAB2 record into our database
  10115. record.prototype.translate = function(item) {
  10116.     // get item type
  10117.     if(this.leader) {
  10118.         var marcType = this.leader[6];
  10119.         if(marcType == "g") {
  10120.             item.itemType = "film";
  10121.         } else if(marcType == "k" || marcType == "e" || marcType == "f") {
  10122.             item.itemType = "artwork";
  10123.         } else if(marcType == "t") {
  10124.             item.itemType = "manuscript";
  10125.         } else {
  10126.             item.itemType = "book";
  10127.         }
  10128.     } else {
  10129.         item.itemType = "book";
  10130.     }
  10131.     
  10132.     // Extract MAB2 fields
  10133.     // FUB Added language, edition, pages, url, edition, series, ISBN, url
  10134.     for (var i = 100; i <= 196; i++) {
  10135.         if (this.getFieldSubfields(i)[0]) {
  10136.             var field = this.getFieldSubfields(i)[0][''a''];
  10137.             var authType = this.getFieldSubfields(i)[0][''b''];
  10138.             this._associateDBField(item, i, "a", "creator", authorMab, authType, true);
  10139.         }
  10140.     }
  10141.  
  10142.     // if (this.getFieldSubfields("800")[0]) this._associateDBField(item, "800", "a", "creator", author, "author", true);
  10143.     if (!item.language) this._associateDBField(item, "037b", "a", "language");    
  10144.     this._associateDBField(item, "200", "a", "creator", corpAuthor);
  10145.     if (!item.title) this._associateDBField(item, "331", "a", "title");
  10146.     this._associateDBField(item, "304", "a", "extra");
  10147.     if (this.getFieldSubfields("335")[0]) {
  10148.         item.title = item.title + ": " + this.getFieldSubfields("335")[0][''a''];
  10149.     }    
  10150.     if (!item.edition) this._associateDBField(item, "403", "a", "edition");
  10151.     if (!item.place) this._associateDBField(item, "410", "a", "place");
  10152.     if (!item.publisher) this._associateDBField(item, "412", "a", "publisher");
  10153.     if (!item.title) this._associateDBField(item, "1300", "a", "title");
  10154.     if (!item.date) this._associateDBField(item, "425", "a", "date", pullNumber);
  10155.     if (!item.pages) this._associateDBField(item, "433", "a", "pages", pullNumber);
  10156.     if (!item.series) this._associateDBField(item, "451", "a", "series");
  10157.     this._associateDBField(item, "501", "a", "extra");
  10158.     this._associateDBField(item, "519", "a", "extra");
  10159.     if (!item.edition) this._associateDBField(item, "523", "a", "edition");
  10160.     if (!item.ISBN) this._associateDBField(item, "540", "a", "ISBN", pullISBN);
  10161.     if (!item.date) this._associateDBField(item, "595", "a", "date", pullNumber);
  10162.     if (!item.url) this._associateDBField(item, "655e", "u", "url");    
  10163.  
  10164.     // Extract German subject headings (RSWK) as tags
  10165.     this._associateTags(item, "902", "acfgpkstz");
  10166.     this._associateTags(item, "907", "acfgpkstz");    
  10167.     this._associateTags(item, "912", "acfgpkstz");    
  10168.     this._associateTags(item, "917", "acfgpkstz");    
  10169.     this._associateTags(item, "922", "acfgpkstz");    
  10170.     this._associateTags(item, "927", "acfgpkstz");    
  10171.     this._associateTags(item, "932", "acfgpkstz");    
  10172.     this._associateTags(item, "937", "acfgpkstz");    
  10173.     this._associateTags(item, "942", "acfgpkstz");    
  10174.  
  10175.  
  10176. }
  10177.  
  10178. function doImport() {
  10179.     var text;
  10180.     var holdOver = "";    // part of the text held over from the last loop
  10181.     
  10182.     Zotero.setCharacterSet("utf-8");
  10183.     
  10184.     while(text = Zotero.read(4096)) {    // read in 4096 byte increments
  10185.         var records = text.split("\x1D");
  10186.         
  10187.         if(records.length > 1) {
  10188.             records[0] = holdOver + records[0];
  10189.             holdOver = records.pop(); // skip last record, since it''s not done
  10190.             
  10191.             for(var i in records) {
  10192.                 var newItem = new Zotero.Item();
  10193.                 
  10194.                 // create new record
  10195.                 var rec = new record();    
  10196.                 rec.importBinary(records[i]);
  10197.                 rec.translate(newItem);
  10198.                 
  10199.                 newItem.complete();
  10200.             }
  10201.         } else {
  10202.             holdOver += text;
  10203.         }
  10204.     }
  10205. }');
  10206.  
  10207. REPLACE INTO translators VALUES ('83979786-44af-494a-9ddb-46654e0486ef', '1.0.0b4.r5', '', '2008-07-07 14:50:00', '0', '100', '4', 'Reuters', 'Michael Berkowitz', 'http://(www\.)?reuters.com/', 
  10208. 'function detectWeb(doc, url) {
  10209.     if (url.match(/article/)) {
  10210.         return "newspaperArticle";
  10211.     }    
  10212. }', 
  10213. 'function doWeb(doc, url) {
  10214.     var item = new Zotero.Item("newspaperArticle");
  10215.  
  10216.     item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@class="article primaryContent"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10217.     item.date = doc.evaluate(''//div[@class="timestampHeader"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/^.*\d{4}/)[0];
  10218.     var byline = doc.evaluate(''//div[@id="resizeableText"]/p[1]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10219.     if (byline.match(/^By/)) {
  10220.         var authors = byline.substr(3).split('','');
  10221.         for each (var aut in authors) {
  10222.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  10223.         }
  10224.         item.abstractNote = doc.evaluate(''//div[@id="resizeableText"]/p[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\-\s+(.*)$/)[1];
  10225.     } else {
  10226.         item.abstractNote = byline.match(/\-\s+(.*)$/)[1];
  10227.     }
  10228.     item.url = url;
  10229.     item.complete();
  10230. }');
  10231.  
  10232. REPLACE INTO translators VALUES ('d93c14fb-d327-4540-b60a-327309ea512b', '1.0.0b4.r5', '', '2008-06-20 20:45:00', '0', '100', '4', 'Journal of Electronic Publishing', 'Michael Berkowitz', 'http://quod.lib.umich.edu/.*c=jep', 
  10233. 'function detectWeb(doc, url) {
  10234.     if (doc.evaluate(''//div/span[text() = "Search Results"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10235.         return "multiple";
  10236.     } else if (url.match(/\d+\.\d+\.\d+/)) {
  10237.         return "journalArticle";
  10238.     }
  10239. }', 
  10240. 'function doWeb(doc, url) {
  10241.     var n = doc.documentElement.namespaceURI;
  10242.     var ns = n ? function(prefix) {
  10243.         if (prefix == ''x'') return n; else return null;
  10244.     } : null;
  10245.     
  10246.     var arts = new Array();
  10247.     if (detectWeb(doc, url) == "multiple") {
  10248.         var links = doc.evaluate(''//div[@id="resultslist"]/div[@class="itemcitation"]/div/a'', doc, ns, XPathResult.ANY_TYPE, null);
  10249.         var link;
  10250.         var items = new Object();
  10251.         while (link = links.iterateNext()) {
  10252.             items[link.href] = Zotero.Utilities.trimInternal(link.textContent);
  10253.         }
  10254.         items = Zotero.selectItems(items);
  10255.         for (var i in items) {
  10256.             arts.push(i);
  10257.         }
  10258.     } else {
  10259.         arts = [url];
  10260.     }
  10261.     Zotero.Utilities.processDocuments(arts, function(doc) {
  10262.         var data = new Object();
  10263.         var rows = doc.evaluate(''//table[@id="itemmdataTable"]//tr'', doc, ns, XPathResult.ANY_TYPE, null);
  10264.         var row;
  10265.         while (row = rows.iterateNext()) {
  10266.             var header = doc.evaluate(''./td[1]'', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10267.             var value = doc.evaluate(''./td[2]'', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10268.             data[Zotero.Utilities.trimInternal(header.replace(":", "").replace("Authors", "Author"))] = value;
  10269.         }
  10270.         var item = new Zotero.Item("journalArticle");
  10271.         item.publicationTitle = "Journal of Electronic Publishing";
  10272.         item.title = data["Title"];
  10273.         var authors = data["Author"].split(",");
  10274.         for each (var aut in authors) {
  10275.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  10276.         }
  10277.         item.url = data["URL"];
  10278.         var voliss = data["Source"].match(/vol\.\s+([^,]+),\s+no\.\s+([^,]+),\s+(.*)$/);
  10279.         item.volume = voliss[1];
  10280.         item.issue = voliss[2];
  10281.         item.date = voliss[3];
  10282.         
  10283.         item.complete();
  10284.     }, function() {Zotero.done;});
  10285.     Zotero.wait();
  10286. }');
  10287.  
  10288. REPLACE INTO translators VALUES ('58a778cc-25e2-4884-95b3-6b22d7571183', '1.0.0b4.r5', '', '2008-06-17 19:30:00', '1', '100', '4', 'Gmail', 'Michael Berkowitz', 'http://mail.google.com/', 
  10289. 'function detectWeb(doc, url) {
  10290.     if (url.match(/#inbox\/[\w\d]+/)) {
  10291.         return "document";
  10292.     }
  10293. }', 
  10294. 'function doWeb(doc, url) {
  10295.     var n = doc.documentElement.namespaceURI;
  10296.     var ns = n ? function(prefix) {
  10297.         if (prefix == ''x'') return n; else return null;
  10298.     } : null;
  10299.     
  10300.     var scripts = doc.evaluate(''//script'', doc, ns, XPathResult.ANY_TYPE, null);
  10301.     var script;
  10302.     var text = "";
  10303.     while (script = scripts.iterateNext()) {
  10304.         text += script.textContent;
  10305.     }
  10306.     var ik = text.match(/ID_KEY:\"([^"]+)\"/)[1]
  10307.     var th = url.match(/#inbox\/(.*)$/)[1];
  10308.     var newurl = ''http://mail.google.com/mail/?ui=2&ik='' + ik + ''&view=om&th='' + th;
  10309.     Zotero.Utilities.HTTP.doGet(newurl, function(text) {
  10310.         var item = new Zotero.Item("email");
  10311.         var to = text.match(/\nTo:\s+([^\n]+)\n/)[1];
  10312.         item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(to.replace(/<.*>/g, "")), "recipient"));
  10313.         var from = text.match(/\nFrom:\s+([^\n]+)\n/)[1];
  10314.         item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(from.replace(/<.*>/g, "")), "author"));
  10315.         item.date = text.match(/\nDate:\s+(.*,\s+\d+\s+\w+\s+\d{4})/)[1];
  10316.         item.subject = text.match(/\nSubject:\s+([^\n]+)/)[1];
  10317.         if (item.subject == "") item.subject = "<No Subject>";
  10318.         item.title = item.subject;
  10319.         item.complete();
  10320.     });
  10321.     Zotero.wait();
  10322. }');
  10323.  
  10324. REPLACE INTO translators VALUES ('490909d7-7d79-4c7a-a136-77df618d4db2', '1.0.0b4.r5', '', '2008-06-20 20:45:00', '1', '100', '4', 'Worldcat.org', 'Michael Berkowitz', 'http://(www.)?worldcat.org/', 
  10325. 'function detectWeb(doc, url) {
  10326.     if (url.match(/search?/) && doc.evaluate(''//input[@id="itemid"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10327.         return "multiple";
  10328.     } else {
  10329.         var type = doc.evaluate(''//tbody/tr/td[2][img]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.toLowerCase().match(/(\w+);/)[1];
  10330.         switch (type) {
  10331.             case "book": return "book";
  10332.             case "article": return "journalArticle";
  10333.             case "recording":
  10334.             case "disc": return "audioRecording";
  10335.             case "tape": return "videoRecording";
  10336.         }
  10337.     }
  10338. }', 
  10339. 'function ENify(str) {
  10340.     return str.match(/^[^&]+/)[0] + ''?page=endnote&client=worldcat.org-detailed_record'';
  10341. }
  10342. function doWeb(doc, url) {
  10343.     var n = doc.documentElement.namespaceURI;
  10344.     var ns = n ? function(prefix) {
  10345.         if (prefix == ''x'') return n; else return null;
  10346.     } : null;
  10347.     
  10348.     var books = new Array();
  10349.     if (detectWeb(doc, url) == "multiple") {
  10350.         var items = new Object();
  10351.         var titles = doc.evaluate(''//div[@class="name"]/a'', doc, ns, XPathResult.ANY_TYPE, null);
  10352.         var title;
  10353.         while (title = titles.iterateNext()) {
  10354.             items[title.href] = Zotero.Utilities.trimInternal(title.textContent);
  10355.         }
  10356.         items = Zotero.selectItems(items);
  10357.         for (var i in items) {
  10358.             books.push(ENify(i));
  10359.         }
  10360.     } else {
  10361.         var link = doc.evaluate(''//a[contains(text(), "EndNote")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  10362.         books = [link];
  10363.     }
  10364.     for each (var book in books) {
  10365.         Zotero.Utilities.HTTP.doGet(book, function(text) {
  10366.             text = text.replace("MUSIC", "PAMP");
  10367.             var translator = Zotero.loadTranslator("import");
  10368.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  10369.             translator.setString(text);
  10370.             translator.translate();
  10371.         });
  10372.         Zotero.wait();
  10373.     }
  10374. }');
  10375.  
  10376. REPLACE INTO translators VALUES ('2943d7fc-3ce8-401c-afd5-ee1f70b7aae0', '1.0.0b4.r5', '', '2008-06-12 19:00:00', '0', '100', '4', 'Helsinki University of Technology', 'Michael Berkowitz', 'https?://teemu.linneanet.fi/', 
  10377. 'function detectWeb(doc, url) {
  10378.     if (url.match(/v\d+=\d+/)) {
  10379.         return "book";
  10380.     } else if (url.match(/Search_Arg/)) {
  10381.         return "multiple";
  10382.     }
  10383. }', 
  10384. 'function MARCify(str) {
  10385.     return str.replace(/v\d+=([^&]+)/, "v3=$1");
  10386. }
  10387.  
  10388. function doWeb(doc, url) {
  10389.     var n = doc.documentElement.namespaceURI;
  10390.     var ns = n ? function(prefix) {
  10391.         if (prefix == ''x'') return n; else return null;
  10392.     } : null;
  10393.     
  10394.     var books = new Array();
  10395.     if (detectWeb(doc, url) == "multiple") {
  10396.         var titles = doc.evaluate(''/html/body/form/table/tbody/tr/td[3]/a'', doc, ns, XPathResult.ANY_TYPE, null);
  10397.         var title;
  10398.         var items = new Object();
  10399.         while (title = titles.iterateNext()) {
  10400.             items[title.href] = Zotero.Utilities.trimInternal(title.textContent);
  10401.         }
  10402.         items = Zotero.selectItems(items);
  10403.         for (var i in items) {
  10404.             books.push(MARCify(i));
  10405.         }
  10406.     } else {
  10407.         books = [MARCify(url)];
  10408.     }
  10409.     var translator = Zotero.loadTranslator("import");
  10410.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  10411.     var marc = translator.getTranslatorObject();
  10412.     Zotero.Utilities.processDocuments(books, function(doc) {
  10413.         var elmts = doc.evaluate(''/html/body/form/table/tbody/tr[th]'', doc, ns, XPathResult.ANY_TYPE, null);
  10414.         var record = new marc.record();
  10415.         var elmt;
  10416.         while (elmt = elmts.iterateNext()) {
  10417.             var field = Zotero.Utilities.superCleanString(doc.evaluate(''./th'', elmt, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10418.             if (field) {
  10419.                 var value = doc.evaluate(''./td[1]'', elmt, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10420.                 if (value.split(/\n/)[1]) value = Zotero.Utilities.trimInternal(value.split(/\n/)[1]);
  10421.                 if(field == "LDR") {
  10422.                     record.leader = value;
  10423.                 } else if(field != "FMT") {
  10424.                     value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  10425.                     var code = field.substring(0, 3);
  10426.                     var ind = "";
  10427.                     if(field.length > 3) {
  10428.                         ind = field[3];
  10429.                         if(field.length > 4) {
  10430.                             ind += field[4];
  10431.                         }
  10432.                     }
  10433.                 
  10434.                     record.addField(code, ind, value);
  10435.                 }
  10436.             }
  10437.         }
  10438.         var item = new Zotero.Item("book");
  10439.         record.translate(item);
  10440.         item.complete();
  10441.     }, function() {Zotero.done;});
  10442.     Zotero.wait();
  10443. }');
  10444.  
  10445. REPLACE INTO translators VALUES ('b662c6eb-e478-46bd- bad4-23cdfd0c9d67', '1.0.0b4.r5', '', '2008-06-12 19:30:00', '0', '100', '4', 'JurPC', 'Oliver Vivell and Michael Berkowitz', 'http://www.jurpc.de/', 
  10446. 'function detectWeb(doc, url) {
  10447.         var doctype = doc.evaluate(''//meta/@doctype'', doc, null,XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10448.  
  10449.         if (doctype == "Aufsatz"){
  10450.                 return "Aufsatz";
  10451.         }else{
  10452.                 return "Rechtsprechung";
  10453.         }
  10454. }', 
  10455. 'function doWeb(doc, url) {
  10456.  
  10457.         var articles = new Array();
  10458.  
  10459.         if (detectWeb(doc, url) == "Aufsatz") {
  10460.  
  10461.                 // Aufsatz gefunden
  10462.  
  10463.                 Zotero.debug("Ok, we have an JurPC Article");
  10464.                 var authors = ''//meta/@Author'';
  10465.                 var title = ''//meta/@Title'';
  10466.                 var webdoktext = ''//meta/@WebDok'';
  10467.  
  10468.                 var authors = parseDoc(authors,doc);
  10469.                 var title = parseDoc(title,doc);
  10470.  
  10471.                 var webabs = webdoktext.substr(webdoktext.lastIndexOf("Abs."), webdoktext.length);
  10472.  
  10473.                 //Zotero.debug(doctype);
  10474.                  Zotero.debug(webdoktext);
  10475.                 var year = url.substr(28, 4);
  10476.  
  10477.                 //Get Year & WebDok Number from Url
  10478.                 var webdok = url.substr(32, 4);
  10479.  
  10480.                 var suche = webdok.indexOf("0");
  10481.                 if (suche == 0){
  10482.                          webdok = url.substr(33, 3);
  10483.                          suche = webdok.indexOf("0");
  10484.  
  10485.                         if(suche == 0){
  10486.                                 webdok = url.substr(34, 2);
  10487.                                 suche = webdok.indexOf("0");
  10488.                                 }
  10489.                                 //Zotero.debug(suche);
  10490.                                 if(suche == 0){
  10491.                                         webdok = url.substr(35, 1);
  10492.                                         suche = webdok.indexOf("0");
  10493.                                 }
  10494.                 }
  10495.  
  10496.                 var re = /<[^>]*>/
  10497.                 Zotero.debug(re);
  10498.                         title = title.replace(re,"");
  10499.                         title = title.replace(re,"");
  10500.                         title = title.replace(re,"");
  10501.                 Zotero.debug(title);
  10502.  
  10503.                 var newArticle = new Zotero.Item(''journalArticle'');
  10504.  
  10505.                 newArticle.title = title;
  10506.                 newArticle.journal = "JurPC";
  10507.                 newArticle.journalAbbreviation = "JurPC";
  10508.                 newArticle.year = year;
  10509.                 newArticle.volume =  "WebDok " + webdok + "/" + year;
  10510.                 newArticle.pages = webabs ;
  10511.                 newArticle.url = url;
  10512.                 var aus = authors.split("/");
  10513.                 for (var i=0; i< aus.length ; i++) {
  10514.                         Zotero.debug(aus[0]);
  10515.                         newArticle.creators.push(Zotero.Utilities.cleanAuthor(aus[i], "author"));
  10516.                 }
  10517.                 newArticle.complete();
  10518.         } else {
  10519.  
  10520.                 // Dokument ist ein Urteil
  10521.  
  10522.                 var gericht = ''//meta/@Gericht'';
  10523.                 var ereignis =  ''//meta/@Ereignis'';
  10524.                 var datum = ''//meta/@Datum'';
  10525.                 var aktz = ''//meta/@aktz'';
  10526.                 var titel =  ''//meta/@Title'';
  10527.                 var webdok = ''//meta/@WebDok'';
  10528.  
  10529.                 try{
  10530.                         var gericht = parseDoc(gericht,doc);
  10531.                         var ereignis = parseDoc(ereignis,doc);
  10532.                         var datum = parseDoc(datum,doc);
  10533.                         var aktz = parseDoc(aktz,doc);
  10534.                         var webdok = parseDoc(webdok,doc);
  10535.                         var titel = parseDoc(titel,doc);
  10536.                 } catch (e) { var titel = doc.evaluate(''//meta/@Titel'', doc, null,XPathResult.ANY_TYPE, null).iterateNext().textContent;}
  10537.                 //Zotero.debug(titel); 
  10538.  
  10539.  
  10540.                  // Informationen an Zotero ├╝bergeben
  10541.  
  10542.                 var newCase = new Zotero.Item(''case'');
  10543.                  newCase.court = gericht;
  10544.                  newCase.caseName = titel;
  10545.                  newCase.title = titel;
  10546.                  newCase.shortTitle = "WebDok " + webdok;
  10547.                  newCase.dateDecided = ereignis + "  , " + aktz;
  10548.                  newCase.url = url;
  10549.                  newCase.journalAbbreviation = "JurPC";
  10550.                 //Zotero.debug(newCase.codeNumber);
  10551.                 newCase.complete();
  10552.     }
  10553. }
  10554.  
  10555. function parseDoc(xpath, doc) {
  10556.         var content = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE,null).iterateNext().textContent;
  10557.         return content;
  10558. }');
  10559.  
  10560. REPLACE INTO translators VALUES ('cae7d3ec-bc8d-465b-974f-8b0dcfe24290', '1.0.0b4.r5', '', '2008-06-12 19:30:00', '0', '100', '4', 'BIUM', 'Michael Berkowitz', 'http://hip.bium.univ-paris5.fr/', 
  10561. 'function detectWeb(doc, url) {
  10562.     if (doc.evaluate(''//td/a[@class="itemTitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10563.         return "multiple";
  10564.     } else if (doc.evaluate(''//td[1]/span[@class="uportal-channel-strong"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10565.         return "book";
  10566.     }
  10567. }', 
  10568. 'function makeMARCurl(link, rsId, rrsId, query) {
  10569.     return ''http://hip.bium.univ-paris5.fr/uPortal/Print?link='' + link + ''&xslFileName=com/dynix/hip/uportal/channels/standard/FullMarc.xsl&F=/searching/getmarcdata&responseSessionId='' + rsId + ''&responseResultSetId='' + rrsId + ''&searchGroup=BIUM-13&query='' + query + ''&searchTargets=16&locale=fr_FR'';
  10570. }
  10571.  
  10572. function doWeb(doc, url) {
  10573.     var n = doc.documentElement.namespaceURI;
  10574.     var ns = n ? function(prefix) {
  10575.         if (prefix == ''x'') return n; else return null;
  10576.     } : null;
  10577.     
  10578.     var books = new Array();
  10579.     if (detectWeb(doc, url) == "multiple") {
  10580.         var items = new Object();
  10581.         var links = doc.evaluate(''//a[@class="itemTitle"]'', doc, ns, XPathResult.ANY_TYPE, null);
  10582.         var link;
  10583.         while (link = links.iterateNext()) {
  10584.             items[link.href] = Zotero.Utilities.trimInternal(link.textContent);
  10585.         }
  10586.         items = Zotero.selectItems(items);
  10587.         var rsId = doc.evaluate(''//input[@name="responseSessionId"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().value;
  10588.         var rrsId = doc.evaluate(''//input[@name="responseResultSetId"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().value;
  10589.         var query = doc.evaluate(''//input[@name="query"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().value;
  10590.         var linkRE = new RegExp("''([^'']+)''", "g");
  10591.         for (var i in items) {
  10592.             var link = linkRE.exec(i)[1];
  10593.             Zotero.debug(link);
  10594.             books.push(makeMARCurl(link, rsId, rrsId, query));
  10595.         }
  10596.     } else {
  10597.         var link = url.match(/link=([^&]+)/)[1];
  10598.         var rsId = url.match(/responseSessionId=([^&]+)/)[1];
  10599.         var rrsId = url.match(/responseResultSetId=([^&]+)/)[1];
  10600.         var query = url.match(/query=([^&]+)/)[1];
  10601.         books = [makeMARCurl(link, rsId, rrsId, query)];
  10602.     }
  10603.     var translator = Zotero.loadTranslator("import");
  10604.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  10605.     var marc = translator.getTranslatorObject();
  10606.     Zotero.Utilities.processDocuments(books, function(doc) {
  10607.         var rows = doc.evaluate(''//center/table/tbody/tr'', doc, ns, XPathResult.ANY_TYPE, null);
  10608.         var row;
  10609.         var record = new marc.record();
  10610.         while (row = rows.iterateNext()) {
  10611.             var field = Zotero.Utilities.trimInternal(doc.evaluate(''./td[1]'', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(":", ""));
  10612.             if (field) {
  10613.                 var value = doc.evaluate(''./td[2]'', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10614.                 if (value.split(/\n/)[1]) value = Zotero.Utilities.trimInternal(value.split(/\n/)[1]);
  10615.                 if (field == "LDR") {
  10616.                     record.leader = value;
  10617.                 } else if (field != "FMT") {
  10618.                     value = value.replace(/\┬ñ([a-z])/g, marc.subfieldDelimiter+ "$1");
  10619.                     var code = field.substring(0, 3);
  10620.                     var ind = "";
  10621.                     if (field.length > 3) {
  10622.                         ind = field[3];
  10623.                         if (field.length > 4) {
  10624.                             ind += field[4];
  10625.                         }
  10626.                     }
  10627.                     record.addField(code, ind, value);
  10628.                 }
  10629.             }
  10630.         }
  10631.         var item = new Zotero.Item();
  10632.         record.translate(item);
  10633.         
  10634.         var oldauthors = item.creators;
  10635.         var newauthors = new Array();
  10636.         for each (var aut in oldauthors) {
  10637.             if (aut.lastName.match(/^[A-Z][^\s]+\s[^\s]+/)) newauthors.push(Zotero.Utilities.cleanAuthor(aut.lastName.match(/^[A-Z][^\s]+\s[^\s]+/)[0].replace(/^([^\s]+)\s+(.*)$/, "$2 $1"), "author"));
  10638.         }
  10639.         item.creators = newauthors;
  10640.         item.complete();
  10641.     }, function() {Zotero.done;});
  10642.     Zotero.wait();
  10643. }');
  10644.  
  10645. REPLACE INTO translators VALUES ('fc410e64-0252-4cd3-acb1-25e584775fa2', '1.0.0b4.r5', '', '2008-08-21 15:45:00', '0', '100', '4', 'National Library of Australia', 'Michael Berkowitz', 'http://librariesaustralia.nla.gov.au/', 
  10646. 'function detectWeb(doc, url) {
  10647.     if (url.match("action=Search")) {
  10648.         return "multiple";
  10649.     } else if (url.match("action=Display")) {
  10650.         return "book";
  10651.     }
  10652. }', 
  10653. 'function doWeb(doc, url) {
  10654.     var n = doc.documentElement.namespaceURI;
  10655.     var ns = n ? function(prefix) {
  10656.         if (prefix == ''x'') return n; else return null;
  10657.     } : null;
  10658.     var books = new Array();
  10659.     if (detectWeb(doc, url) == "multiple") {
  10660.         var items = Zotero.Utilities.getItemArray(doc, doc, ''action=Display&'');
  10661.         items = Zotero.selectItems(items);
  10662.         for (var i in items) {
  10663.             books.push(i);
  10664.         }
  10665.     } else {
  10666.         books = [url];
  10667.     }
  10668.     Zotero.Utilities.processDocuments(books, function(doc) {
  10669.         var table = doc.evaluate(''//tbody/tr[td[1][@class="CellAlignRight"]/strong]'', doc, ns, XPathResult.ANY_TYPE, null);
  10670.         var row;
  10671.         var data = new Object();
  10672.         while (row = table.iterateNext()) {
  10673.             var heading = doc.evaluate(''./td[1]'', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10674.             var value = doc.evaluate(''./td[2]'', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10675.             data[Zotero.Utilities.trimInternal(heading)] = value;
  10676.         }
  10677.         item = new Zotero.Item("book");
  10678.         item.title = Zotero.Utilities.trimInternal(data[''Title:''].match(/^[^/]+/)[0]);
  10679.         if (data[''Author:'']) item.creators.push(Zotero.Utilities.cleanAuthor(data[''Author:''], "author", true));
  10680.         if (data[''Published:''].match(/\w+/)) {
  10681.             var pub = data[''Published:''].match(/^([^:]+):(.*)\s+([^\s]+)$/);
  10682.             item.location = Zotero.Utilities.trimInternal(pub[1]);
  10683.             item.publisher = Zotero.Utilities.trimInternal(pub[2]);
  10684.             item.date = Zotero.Utilities.trimInternal(pub[3].replace(/\D/g, ""));
  10685.         }
  10686.         if (data[''Subjects:'']) {
  10687.             var kws = data[''Subjects:''].split(".");
  10688.             for each (var key in kws) {
  10689.                 if (key.match(/\w+/)) item.tags.push(key);
  10690.             }
  10691.         }
  10692.         if (data[''ISBN:'']) item.ISBN = Zotero.Utilities.trimInternal(data[''ISBN:''].match(/^[^(]+/)[0]);
  10693.         item.complete();
  10694.     }, function() {Zotero.done;});
  10695.     Zotero.wait();
  10696. }');
  10697.  
  10698. REPLACE INTO translators VALUES ('e40a27bc-0eef-4c50-b78b-37274808d7d2', '1.0.0b4.r5', '', '2008-06-06 08:45:00', '0', '100', '4', 'J-Stage', 'Michael Berkowitz', 'http://www.jstage.jst.go.jp/', 
  10699. 'function detectWeb(doc, url) {
  10700.     if (doc.evaluate(''//a[contains(@href, "_ris")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10701.         return "journalArticle";
  10702.     } else if (doc.evaluate(''//tr/td[2]/table/tbody/tr/td/table/tbody/tr[td[2]//a]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
  10703.         doc.evaluate(''//tr/td/table/tbody/tr/td/table/tbody/tr[td[1]//a]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10704.         return "multiple";
  10705.     }
  10706. }
  10707. ', 
  10708. 'function RISify(str) {
  10709.     return str.replace("_article", "_ris").replace("article", "download");
  10710. }
  10711.  
  10712. function doWeb(doc, url) {
  10713.     var n = doc.documentElement.namespaceURI;
  10714.     var ns = n ? function(prefix) {
  10715.         if (prefix == ''x'') return n; else return null;
  10716.     } : null;
  10717.     
  10718.     var arts = new Array();
  10719.     if (detectWeb(doc, url) == "multiple") {
  10720.         var items = new Object();
  10721.         var xpath;
  10722.         var titlex;
  10723.         var linkx;
  10724.         if (doc.evaluate(''//tr/td[2]/table/tbody/tr/td/table/tbody/tr[td[2]//a]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  10725.             xpath = ''//tr/td[2]/table/tbody/tr/td/table/tbody/tr[td[2]//a]'';
  10726.             titlex = ''./td[2]//strong'';
  10727.             linkx = ''./td[2]//a[1]'';
  10728.         } else if (doc.evaluate(''//tr/td/table/tbody/tr/td/table/tbody/tr[td[1]//a]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  10729.             xpath = ''/html/body/div/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[td//a[contains(@href, "_pdf")]]'';
  10730.             titlex = ''.//td/b'';
  10731.             linkx = ''.//td/a[contains(@href, "_article")]'';
  10732.         }
  10733.         Zotero.debug(xpath);
  10734.         
  10735.         var list = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null);
  10736.         var nextitem;
  10737.         while (nextitem = list.iterateNext()) {
  10738.             var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, nextitem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10739.             var link = doc.evaluate(linkx, nextitem, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  10740.             items[link] = title;
  10741.         }
  10742.         items = Zotero.selectItems(items);
  10743.         for (var i in items) {
  10744.             arts.push(RISify(i));
  10745.         }
  10746.     } else {
  10747.         arts = [RISify(url)];
  10748.     }
  10749.     Zotero.debug(arts);
  10750.     for each (var uri in arts) {
  10751.         Zotero.Utilities.HTTP.doGet(uri, function(text) {
  10752.             Zotero.debug(text);
  10753.             var translator = Zotero.loadTranslator("import");
  10754.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  10755.             translator.setString(text);
  10756.             translator.setHandler("itemDone", function(obj, item) {
  10757.                 item.url = uri.replace("download", "article").replace("_ris", "_article");
  10758.                 var pdfurl = item.url.replace(/(\d+)_(\d+)\/_article/, "$2/_pdf").replace("download", "article");
  10759.                 Zotero.debug(pdfurl);
  10760.                 item.attachments = [
  10761.                     {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"},
  10762.                     {url:pdfurl, title:item.publicationTitle + " PDF", mimeType:"application/pdf"}
  10763.                 ];
  10764.                 item.complete();
  10765.             });
  10766.             translator.translate();
  10767.         });
  10768.     }
  10769. }');
  10770.  
  10771. REPLACE INTO translators VALUES ('bbf1617b-d836-4665-9aae-45f223264460', '1.0.0b4.r5', '', '2008-06-03 19:40:00', '0', '100', '4', 'A Contra Corriente', 'Michael Berkowitz', 'http://www.ncsu.edu/project/acontracorriente', 
  10772. 'function detectWeb(doc, url) {
  10773.     if (doc.evaluate(''//tr[td[1]//img][td[3]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  10774.         return "multiple";
  10775.     }
  10776. }', 
  10777. 'function doWeb(doc, url) {
  10778.     var arts = doc.evaluate(''//tr[td[1]//img][td[3]]'', doc, null, XPathResult.ANY_TYPE, null);
  10779.     var art;
  10780.     var selectList = new Object();
  10781.     var items = new Object();
  10782.     while (art = arts.iterateNext()) {
  10783.         var item = new Object();
  10784.         var title = doc.evaluate(''.//a'', art, null, XPathResult.ANY_TYPE, null).iterateNext();
  10785.         item[''title''] = Zotero.Utilities.trimInternal(title.textContent);
  10786.         item[''pdfurl''] = title.href;
  10787.         item[''author''] = doc.evaluate(''.//strong'', art, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10788.         selectList[item.title] = item.title;
  10789.         items[item.title] = item;
  10790.     }
  10791.     var selected = Zotero.selectItems(selectList);
  10792.     var voliss = Zotero.Utilities.trimInternal(doc.evaluate(''//td[@class="red01"]/font[2]/strong'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10793.     voliss = voliss.match(/Vol\.\s+(\d+),\s+No\.\s+(\d+)\.\s+([^|]+)|/);
  10794.     Zotero.debug(voliss);
  10795.     for each (var title in selected) {
  10796.         var item = new Zotero.Item("journalArticle");
  10797.         var olditem = items[title];
  10798.         item.title = olditem.title;
  10799.         item.creators = [Zotero.Utilities.cleanAuthor(olditem.author, "author")];
  10800.         item.volume = voliss[1];
  10801.         item.issue = voliss[2]
  10802.         item.date = Zotero.Utilities.trimInternal(voliss[3]);
  10803.         item.complete();
  10804.     }
  10805. }');
  10806.  
  10807. REPLACE INTO translators VALUES ('0aea3026-a246-4201-a4b5-265f75b9a6a7', '1.0.0b4.r5', '', '2008-05-30 08:00:00', '0', '100', '4', 'Australian Dictionary of Biography', 'Tim Sherratt and Michael Berkowitz', 'http://www.adb.online.anu.edu.au', 
  10808. 'function detectWeb(doc, url) {
  10809.     if (url.match(/adbp-ent_search|browse_people|browse_authors/)) {
  10810.         return "multiple";
  10811.     } else if (url.match(/biogs\/AS*\d+b.htm/)) {
  10812.     return "bookSection";
  10813.     }
  10814. }', 
  10815. 'function doWeb(doc, url) {
  10816.     var namespace = doc.documentElement.namespaceURI;
  10817.     var nsResolver = namespace ? function(prefix) {
  10818.             if (prefix == "x") return namespace; else return null;
  10819.         } : null;
  10820.     if (detectWeb(doc, url) == "multiple") {
  10821.         var records = new Array();
  10822.         var items = new Object();
  10823.         if (url.match(/browse_people/)) {
  10824.             var titles = doc.evaluate(''//ul[@class="pb-results"]/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10825.             var links = doc.evaluate(''//ul[@class="pb-results"]/li/a[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10826.         } else if (url.match(/browse_authors/)) {
  10827.             var titles = doc.evaluate(''//div[@id="content"]/dl/dd'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10828.             var links = doc.evaluate(''//div[@id="content"]/dl/dd/a[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10829.         } else if (url.match(/adbp-ent_search/)) {
  10830.             var titles = doc.evaluate(''//div[@id="content"]/ol/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10831.             var links = doc.evaluate(''//div[@id="content"]/ol/li//a[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10832.         }
  10833.         var title;
  10834.         var link;
  10835.         while ((link = links.iterateNext()) && (title = titles.iterateNext())) {
  10836.             items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  10837.         }
  10838.         
  10839.         items = Zotero.selectItems(items);
  10840.         for (var i in items) {
  10841.             records.push(i);
  10842.         }
  10843.     } else {
  10844.         records = [url]; 
  10845.     }
  10846.     Zotero.Utilities.processDocuments(records, function(doc) {
  10847.         var item = new Zotero.Item("bookSection");
  10848.         var author = Zotero.Utilities.cleanString(doc.evaluate(''//div[@id="content"]/p[strong="Author"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10849.         item.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  10850.         item.title = Zotero.Utilities.cleanString(doc.evaluate(''//h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10851.         var pubdetails = Zotero.Utilities.cleanString(doc.evaluate(''//div[@id="content"]/p[strong="Print Publication Details"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10852.         pubdetails = pubdetails.match(/Volume (\d+), ([\w ]+), (\d{4}), p+\.*\s+([\d-]+)/);
  10853.         item.volume = RegExp.$1;
  10854.         item.publisher = RegExp.$2;
  10855.         item.date = RegExp.$3;
  10856.         item.pages = RegExp.$4;
  10857.         item.url = doc.location.href;
  10858.         item.bookTitle = "Australian Dictionary of Biography";
  10859.         item.place = "Melbourne";
  10860.         item.repository = "Australian Dictionary of Biography";
  10861.         var tags = doc.evaluate(''//li/a[starts-with(@title, "find people with the occupation")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10862.         while (tag = tags.iterateNext()) {
  10863.             item.tags.push(tag.textContent);
  10864.         }
  10865.         item.attachments = [
  10866.             {url:item.url, title: "Snapshot - " + item.title, mimeType:"text/html"},
  10867.         ];
  10868.         item.complete();
  10869.         
  10870.     }, function() {Zotero.done;});
  10871. }');
  10872.  
  10873. REPLACE INTO translators VALUES ('83538f48-906f-40ef-bdb3-e94f63676307', '1.0.0b4.r5', '', '2008-05-30 08:00:00', '1', '100', '4', 'NAA RecordSearch', 'Tim Sherratt', 'http://naa12.naa.gov.au/scripts/', 
  10874. 'function detectWeb(doc, url) {
  10875.     if (url.match(/Items_listing.asp/i)) {
  10876.         return "multiple";
  10877.     } else if (url.match(/ItemDetail.asp/i)) {
  10878.     return "manuscript";
  10879.     }
  10880. }', 
  10881. 'function doWeb(doc, url) {
  10882.     var namespace = doc.documentElement.namespaceURI;
  10883.     var nsResolver = namespace ? function(prefix) {
  10884.             if (prefix == ''x'') return namespace; else return null;
  10885.         } : null;
  10886.     if (detectWeb(doc, url) == "multiple") {
  10887.         var records = new Array();
  10888.         var items = new Object();
  10889.         var titles = doc.evaluate(''//form[2]/table/tbody/tr/td[b="Title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10890.         var links = doc.evaluate(''//form[2]/table/tbody/tr/td[b="Control symbol"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10891.         var title;
  10892.         var link;
  10893.         while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  10894.             items[link.href] = Zotero.Utilities.trimInternal(title.lastChild.textContent);
  10895.         }
  10896.         items = Zotero.selectItems(items);
  10897.         for (var i in items) {
  10898.             records.push(i);
  10899.         }
  10900.     } else {
  10901.         records = [url]; 
  10902.     }
  10903.     Zotero.Utilities.processDocuments(records, function(doc) {
  10904.         var title = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Title"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10905.         var series = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Series number"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10906.         var control = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Control symbol"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10907.         var date = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Contents date range"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10908.         var access = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Access status"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10909.         var location = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Location"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10910.         var barcode = Zotero.Utilities.cleanString(doc.evaluate(''//table/tbody/tr/td[b="Barcode"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent);
  10911.         if (doc.body.innerHTML.match("View digital copy")) {
  10912.             var digitised = "yes";
  10913.         } else {
  10914.             var digitised = "no";
  10915.         }
  10916.         var repository ="National Archives of Australia, " + location;
  10917.         var url = "http://www.aa.gov.au/cgi-bin/Search?O=I&Number=" + barcode;
  10918.         var ref_number = series + ", " + control;
  10919.         var type = "file";
  10920.         var item = new Zotero.Item("manuscript");
  10921.         item.title = title;
  10922.         item.archiveLocation = ref_number;
  10923.         item.url = url;
  10924.         item.date = date;
  10925.         item.manuscriptType = type;
  10926.         item.extra = "Access: " + access + "\nDigitised: " + digitised;
  10927.         item.repository = repository;
  10928.         item.complete();
  10929.         
  10930.     }, function() {Zotero.done;});
  10931. }');
  10932.  
  10933. REPLACE INTO translators VALUES ('cdf8269c-86b9-4039-9bc4-9d998c67740e', '1.0.0b4.r5', '', '2008-05-21 19:15:00', '0', '100', '4', 'Verniana-Jules Verne Studies', 'Michael Berkowitz', 'http://jv.gilead.org.il/studies/', 
  10934. 'function detectWeb(doc, url) {
  10935.     if (url.match(/article\/view/)) {
  10936.         return "journalArticle";
  10937.     } else  if (url.match(/(issue|advancedResults)/)) {
  10938.         return "multiple";
  10939.     }
  10940. }', 
  10941. 'function prepNos(link) {
  10942.     if (link.match(/\d+\/\d+$/)) {
  10943.         var nos = link.match(/\d+\/\d+$/)[0];
  10944.     } else {
  10945.         var nos = link.match(/\d+$/)[0] + ''/0'';
  10946.     }
  10947.     return ''http://jv.gilead.org.il/studies/index.php/studies/rt/captureCite/'' + nos + ''/RefManCitationPlugin'';
  10948. }
  10949.  
  10950. function doWeb(doc, url) {
  10951.     var n = doc.documentElement.namespaceURI;
  10952.     var ns = n ? function(prefix) {
  10953.         if (prefix == ''x'') return n; else return null;
  10954.     } : null;
  10955.     
  10956.     var arts = new Array();
  10957.     if (detectWeb(doc, url) == "multiple") {
  10958.         var items = new Object();
  10959.         var xpath = ''//tr[td/a[2]]'';
  10960.         if (url.match(/issue/)) {
  10961.             var titlex = ''./td[1]'';
  10962.             var linkx = ''./td[2]/a[contains(text(), "HTML")]'';
  10963.         } else if (url.match(/advanced/)) {
  10964.             var titlex = ''./td[2]'';
  10965.             var linkx = ''./td[3]/a[contains(text(), "HTML")]'';
  10966.         }
  10967.         var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null);
  10968.         var result;
  10969.         while (result = results.iterateNext()) {
  10970.             var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  10971.             var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  10972.             items[link] = title;
  10973.         }
  10974.         items = Zotero.selectItems(items);
  10975.         for (var i in items) {
  10976.             arts.push(prepNos(i));
  10977.         }
  10978.     } else {
  10979.         arts = [prepNos(url)];
  10980.     }
  10981.     Zotero.Utilities.HTTP.doGet(arts, function(text) {
  10982.         var translator = Zotero.loadTranslator("import");
  10983.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  10984.         translator.setString(text);
  10985.         translator.setHandler("itemDone", function(obj, item) {
  10986.             var auts = new Array();
  10987.             for each (var aut in item.creators) {
  10988.                 auts.push(Zotero.Utilities.cleanAuthor(aut.lastName, "author"));
  10989.             }
  10990.             item.creators = auts;
  10991.             item.attachments = [{url:item.url, title:"Verniana Snapshot", mimeType:"text/html"}];
  10992.             var bits = item.publicationTitle.split(/;/);
  10993.             item.publicationTitle = bits[0];
  10994.             var voliss = bits[1].match(/Vol\s+(\d+)\s+\((\d+)\)/);
  10995.             item.volume = voliss[1];
  10996.             item.date = voliss[2];
  10997.             item.complete();    
  10998.         });
  10999.         translator.translate();
  11000.     });
  11001.     Zotero.wait();
  11002. }');
  11003.  
  11004. REPLACE INTO translators VALUES ('b33af0e1-d122-45b2-b144-4b4eedd12d5d', '1.0.0b4.r5', '', '2008-05-21 19:15:00', '0', '100', '4', 'Wildlife Biology in Practice', 'Michael Berkowitz', 'http://www.socpvs.org/journals/index.php/wbp', 
  11005. 'function detectWeb(doc, url) {
  11006.     if (url.match(/showToc/) || url.match(/advancedResults/)) {
  11007.         return "multiple";
  11008.     } else if (url.match(/article/)) {
  11009.         return "journalArticle";
  11010.     }
  11011. }', 
  11012. 'function doWeb(doc, url) {
  11013.     var n = doc.documentElement.namespaceURI;
  11014.     var ns = n ? function(prefix) {
  11015.         if (prefix == ''x'') return n; else return null;
  11016.     } : null;
  11017.     
  11018.     var arts = new Array();
  11019.     if (detectWeb(doc, url) == "multiple") {
  11020.         var items = new Object();
  11021.         var xpath = ''//tr[td/a[2]]'';
  11022.         if (url.match(/issue/)) {
  11023.             var linkx = ''./td[2]/a[1]'';
  11024.             var titlex = ''./td[1]'';
  11025.         } else if (url.match(/advanced/)) {
  11026.             var linkx = ''./td[3]/a[1]'';
  11027.             var titlex = ''./td[2]'';
  11028.         }
  11029.         var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null);
  11030.         var result;
  11031.         while (result = results.iterateNext()) {
  11032.             var title = doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11033.             var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11034.             items[link] = Zotero.Utilities.trimInternal(title);
  11035.         }
  11036.         items = Zotero.selectItems(items);
  11037.         for (var i in items) {
  11038.             arts.push(i.replace(/view/, "viewArticle"));
  11039.         }
  11040.     } else {
  11041.         arts = [url.replace(/viewRST/, "viewArticle")];
  11042.     }
  11043.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11044.         var item = new Zotero.Item("journalArticle");
  11045.         var voliss = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="main"]/h2'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11046.         voliss = voliss.match(/^([^,]+),\s+([^;]+);\s+(\d+)\((\d+)\);\s+([^;]+)/);
  11047.         item.journalAbbreviation = voliss[1];
  11048.         item.date = voliss[2];
  11049.         item.issue = voliss[3];
  11050.         item.volume = voliss[4];
  11051.         item.pages = voliss[5];
  11052.         var authors = doc.evaluate(''//div[@id="authorDetails"]/ul[@class="lista"]/li/strong/a'', doc, ns, XPathResult.ANY_TYPE, null);
  11053.         var author;
  11054.         while (author = authors.iterateNext()) {
  11055.             item.creators.push(Zotero.Utilities.cleanAuthor(author.title.match(/^\w+\b\s+(.*)\s+\b\w+$/)[1], "author"));
  11056.         }
  11057.         item.publicationTitle = "Wildlife Biology in Practice";
  11058.         item.ISSN = "1646-2742";
  11059.         item.DOI = doc.evaluate(''//div[@id="copyArticle"]/a[1]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/doi:\s+([^\s]+)/)[1];
  11060.         item.url = doc.location.href;
  11061.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="content"]/h3'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11062.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="abstract"]/blockquote/p'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11063.         item.tags = doc.evaluate(''//div[@id="abstract"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Keywords:\s+([^\.]+)/)[1].split(/,\s+/);
  11064.         
  11065.         var pdfurl = doc.evaluate(''//div[@id="rt"]/a[@class="action noarrow"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11066.         item.attachments = [
  11067.             {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"},
  11068.             {url:pdfurl, title:item.publicationTitle + " PDF", mimeType:"application/pdf"}
  11069.         ];
  11070.         item.complete();
  11071.     }, function() {Zotero.done;});
  11072.     Zotero.wait();
  11073. }');
  11074.  
  11075. REPLACE INTO translators VALUES ('d2416f31-4f24-4e18-8c66-06122af5bc2c', '1.0.0b4.r5', '', '2008-05-20 19:10:00', '0', '100', '4', 'Women in Judaism', 'Michael Berkowitz', 'http://jps.library.utoronto.ca/', 
  11076. 'function detectWeb(doc, url) {
  11077.     if (doc.evaluate(''//tr[td/a[2]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11078.         return "multiple";
  11079.     } else if (url.match(/article\/view/)) {
  11080.         return "journalArticle";
  11081.     }
  11082. }', 
  11083. 'function doWeb(doc, url) {
  11084.     var n = doc.documentElement.namespaceURI;
  11085.     var ns = n ? function(prefix) {
  11086.         if (prefix == ''x'') return n; else return null;
  11087.     } : null;
  11088.     
  11089.     var arts = new Array();
  11090.     if (detectWeb(doc, url) == "multiple") {
  11091.         var xpath = ''//tr[td/a[2]]'';
  11092.         if (url.match(/search/)) {
  11093.             var titlex = ''./td[2]'';
  11094.             var linkx = ''./td[3]/a[1]'';
  11095.         } else if (url.match(/issue/)) {
  11096.             var titlex = ''./td[1]'';
  11097.             var linkx = ''./td[2]/a[1]'';
  11098.         }
  11099.         var items = new Object();
  11100.         var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null);
  11101.         var result;
  11102.         while (result = results.iterateNext()) {
  11103.             var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11104.             var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11105.             items[link] = title;
  11106.         }
  11107.         items = Zotero.selectItems(items);
  11108.         for (var i in items) {
  11109.             arts.push(i.replace("view", "viewArticle"));
  11110.         }
  11111.     } else {
  11112.         arts = [url];
  11113.     }
  11114.     Zotero.debug(arts);
  11115.     Zotero.Utilities.processDocuments(arts,function(doc) {
  11116.         var newDoc = doc;
  11117.         //var newDoc = doc.defaultView.window.frames[0].document;
  11118.         Zotero.debug(newDoc.location.href);
  11119.         
  11120.         var item = new Zotero.Item("journalArticle");
  11121.         if (newDoc.evaluate(''//div[@class="Section1"]/div/p/b/span'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11122.             item.title = Zotero.Utilities.trimInternal(newDoc.evaluate(''//div[@class="Section1"]/div/p/b/span'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11123.         } else {
  11124.             item.title = Zotero.Utilities.trimInternal(newDoc.evaluate(''//div[@id="content"]/h3'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11125.         }
  11126.         var absX = ''//div[@id="content"]/div[2]'';
  11127.         if (newDoc.evaluate(absX, newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext()) item.abstractNote = Zotero.Utilities.trimInternal(newDoc.evaluate(absX, newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11128.         if (newDoc.evaluate(''//div[@id="content"]/div/i'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11129.             var authors = newDoc.evaluate(''//div[@id="content"]/div/i'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/,\s+/);
  11130.             for each (var aut in authors) {
  11131.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  11132.             }
  11133.             var voliss = newDoc.evaluate(''//div[@id="breadcrumb"]/a[2]'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/(\d+)/g);
  11134.             item.volume = voliss[0];
  11135.             item.issue = voliss[1];
  11136.             item.date = voliss[2];
  11137.         }
  11138.         var pdfurl = doc.evaluate(''//a[contains(text(), "PDF")]'', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().href.replace("view", "download");
  11139.         item.attachments = [
  11140.             {url:doc.location.href, title:"Women In Judaism Snapshot", mimeType:"text/html"},
  11141.             {url:pdfurl, title:"Women In Judaism PDF", mimeType:"application/pdf"}
  11142.         ];
  11143.         item.complete();
  11144.     }, function() {Zotero.done;});
  11145.     Zotero.wait();
  11146. }');
  11147.  
  11148. REPLACE INTO translators VALUES ('4f62425a-c99f-4ce1-b7c1-5a3ac0d636a3', '1.0.0b4.r5', '', '2008-05-20 19:10:00', '0', '100', '4', 'AfroEuropa', 'Michael Berkowitz', 'http://journal.afroeuropa.eu/', 
  11149. 'function detectWeb(doc, url) {
  11150.     if (doc.evaluate(''//tr[td/a[2]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11151.         return "multiple";
  11152.     } else if (url.match(/article\/view\//)) {
  11153.         return "journalArticle";
  11154.     }
  11155. }', 
  11156. 'function makeExport(site, str) {
  11157.     var nums = str.match(/\d+(\/\d+)?/)[0];
  11158.     if (!nums.match(/\//)) nums += "/0";
  11159.     return site + ''rt/captureCite/'' + nums + ''/referenceManager'';
  11160. }
  11161.  
  11162. function doWeb(doc, url) {
  11163.     var n = doc.documentElement.namespaceURI;
  11164.     var ns = n ? function(prefix) {
  11165.         if (prefix == ''x'') return n; else return null;
  11166.     } : null;
  11167.     
  11168.     var site = url.match(/^http:\/\/([^/]*\/)+index\.php\/[^/]*\//)[0];
  11169.     var arts = new Array();
  11170.     if (detectWeb(doc, url) == "multiple") {
  11171.         var xpath = ''//tr[td/a]'';
  11172.         if (url.match(/search/)) {
  11173.             var titlex = ''./td[2]'';
  11174.             var linkx = ''./td[3]/a[1]'';
  11175.         } else if (url.match(/issue/)) {
  11176.             var titlex = ''./td[1]'';
  11177.             var linkx = ''./td[2]/a[1]'';
  11178.         }
  11179.         var items = new Object();
  11180.         var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null);
  11181.         var result;
  11182.         while (result = results.iterateNext()) {
  11183.             var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11184.             var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11185.             items[makeExport(site, link)] = title;
  11186.         }
  11187.         items = Zotero.selectItems(items);
  11188.         for (var i in items) {
  11189.             arts.push(i);
  11190.         }
  11191.     } else {
  11192.         arts = [makeExport(cite, url)];
  11193.     }
  11194.     Zotero.Utilities.HTTP.doGet(arts, function(text) {
  11195.         var translator = Zotero.loadTranslator("import");
  11196.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11197.         translator.setString(text);
  11198.         translator.setHandler("itemDone", function(obj, item) {
  11199.             item.title = Zotero.Utilities.capitalizeTitle(item.title);
  11200.             var voliss = item.publicationTitle.split(/;\s+/);
  11201.             item.publicationTitle = Zotero.Utilities.trimInternal(voliss[0]);
  11202.             voliss = voliss[1].match(/(\d+),\s+No\s+(\d+)\s+\((\d+)\)/);
  11203.             item.volume = voliss[1];
  11204.             item.issue = voliss[2];
  11205.             item.date = voliss[3];
  11206.             var auts = new Array();
  11207.             for each (var aut in item.creators) {
  11208.                 auts.push(aut.lastName);
  11209.             }
  11210.             item.creators = new Array();
  11211.             for each (var aut in auts) {
  11212.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  11213.             }
  11214.             item.attachments[0].mimeType = "text/html";
  11215.             item.attachments[0].title = "AfroEuropa Snapshot";
  11216.             item.complete();
  11217.         });
  11218.         translator.translate();
  11219.     });
  11220.     Zotero.wait();
  11221. }');
  11222.  
  11223. REPLACE INTO translators VALUES ('882f70a8-b8ad-403e-bd76-cb160224999d', '1.0.0b4.r5', '', '2008-05-19 17:20:00', '0', '100', '4', 'Vanderbilt eJournals', 'Michael Berkowitz', 'http://ejournals.library.vanderbilt.edu/', 
  11224. 'function detectWeb(doc, url) {
  11225.     if (url.match(/viewarticle.php/)) {
  11226.         return "journalArticle";
  11227.     } else if (url.match(/viewissue.php/) || url.match(/search.php/)) {
  11228.         return "multiple";
  11229.     }
  11230. }', 
  11231. 'function doWeb(doc, url) {
  11232.     var n = doc.documentElement.namespaceURI;
  11233.     var ns = n ? function (prefix) {
  11234.         if (prefix == ''x'') return n; else return null;
  11235.     } : null;
  11236.     var arts = new Array();
  11237.     if (detectWeb(doc, url) == "multiple") {
  11238.         var items = new Object();
  11239.         if (doc.evaluate(''/html/body/table/tbody/tr/td[2]/ul/li'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11240.             var results = doc.evaluate(''/html/body/table/tbody/tr/td[2]/ul/li'', doc, ns, XPathResult.ANY_TYPE, null);
  11241.             var titleX = ''./span[@class="toctitle"]'';
  11242.             var linkX = ''.//a[contains(text(), "Abstract")]'';
  11243.             /*var res;
  11244.             while (res = results.iterateNext()) {
  11245.                 var title = doc.evaluate(''./span[@class="toctitle"]'', res, ns, XPathResult.ANY_TYPE, null).iterateNext.textContent;
  11246.                 var link = doc.evaluate(''.//a[contains(text(), "Abstract")]'', res, ns, XPathResult.ANY_TYPE, null).iterateNext.href;
  11247.                 items[link] = title;
  11248.             }*/
  11249.         } else {
  11250.             var results = doc.evaluate(''//tr[td[3]//a[contains(text(), "Abstract")]]'', doc, ns, XPathResult.ANY_TYPE, null);
  11251.             var titleX = ''./td[2]'';
  11252.             var linkX = ''./td[3]//a'';
  11253.         }
  11254.         var res;
  11255.         while (res = results.iterateNext()) {
  11256.             var title = doc.evaluate(titleX, res, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11257.             var link = doc.evaluate(linkX, res, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11258.             items[link] = Zotero.Utilities.trimInternal(title);
  11259.         }
  11260.         items = Zotero.selectItems(items);
  11261.         for (var i in items) {
  11262.             arts.push(i);
  11263.         }
  11264.     } else {
  11265.         arts = [url];
  11266.     }
  11267.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11268.         var pdfurl = doc.evaluate(''//a[contains(text(), "PDF")]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11269.         var gets = doc.location.href.match(/^(http:\/\/[^/]+\/[^/]+\/).*id=(\d+)/);
  11270.         var risurl = gets[1] + ''rst/rst.php?op=capture_cite&id='' + gets[2] + ''&cite=refman'';
  11271.         Zotero.Utilities.HTTP.doGet(risurl, function(text) {
  11272.             var translator = Zotero.loadTranslator("import");
  11273.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11274.             translator.setString(text);
  11275.             translator.setHandler("itemDone", function(obj, item) {
  11276.                 var voliss = item.publicationTitle.split(/;/);
  11277.                 item.publicationTitle = voliss[0];
  11278.                 voliss = voliss[1].match(/Vol\.\s+(\d+)(,\s+No\.\s+(\d+))?\s+\((\d+)\)/);
  11279.                 item.volume = voliss[1];
  11280.                 if (voliss[3]) item.issue = voliss[3];
  11281.                 item.date = voliss[4];                
  11282.                 item.attachments = [
  11283.                     {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"},
  11284.                     {url:pdfurl, title:item.publicationTitle + " PDF", mimeType:"application/pdf"}
  11285.                 ];
  11286.                 item.complete();    
  11287.             });
  11288.             translator.translate();
  11289.         });
  11290.     }, function() {Zotero.done;});
  11291.     Zotero.wait();
  11292. }');
  11293.  
  11294. REPLACE INTO translators VALUES ('4363275e-5cc5-4627-9a7f-951fb58a02c3', '1.0.0b4.r5', '', '2008-05-15 19:30:00', '0', '100', '4', 'Cornell University Press', 'Michael Berkowitz', 'http://www.cornellpress.cornell.edu/', 
  11295. 'function detectWeb(doc, url) {
  11296.     if (url.match("detail.taf")) {
  11297.         return "book";
  11298.     } else if (url.match("list.taf") || url.match("listsearch.taf")) {
  11299.         return "multiple";
  11300.     }
  11301. }', 
  11302. 'function doWeb(doc, url) {
  11303.     var n = doc.documentElement.namespaceURI;
  11304.     var ns = n ? function (prefix) {
  11305.         if (prefix == ''x'') return n; else return null;
  11306.     } : null;
  11307.     
  11308.     var books = new Array();
  11309.     if (detectWeb(doc, url) == "multiple") {
  11310.         var items = new Object();
  11311.         var titles = doc.evaluate(''//tr/td[2]/a'', doc, ns, XPathResult.ANY_TYPE, null);
  11312.         var title;
  11313.         while (title = titles.iterateNext()) {
  11314.             if (title.textContent.match(/\w+/)) items[title.href] = Zotero.Utilities.trimInternal(title.textContent);
  11315.         }
  11316.         items = Zotero.selectItems(items);
  11317.         for (var i in items) {
  11318.             books.push(i);
  11319.         }
  11320.     } else {
  11321.         books = [url];
  11322.     }
  11323.     Zotero.Utilities.processDocuments(books, function(doc) {
  11324.         var item = new Zotero.Item("book");
  11325.         item.title = Zotero.Utilities.capitalizeTitle(doc.evaluate(''//span[@class="bktitle"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11326.         var authors = doc.evaluate(''//div[@id="detail"]/table/tbody/tr/td/form/a'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/;/);
  11327.         Zotero.debug(authors);
  11328.         for each (var aut in authors) {
  11329.             if (aut.match(/Translator/)) {
  11330.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut.match(/^(.*)\s+\(/)[1], "translator"));
  11331.             } else if (aut.match(/Editor/)) {
  11332.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut.match(/^(.*)\s+\(/)[1], "editor"));
  11333.             } else {
  11334.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  11335.             }
  11336.         }
  11337.         var bits = doc.evaluate(''//div[@id="detail"]/table/tbody/tr/td/form'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11338.         item.ISBN = bits.match(/ISBN:\s+([\d\-]+)/)[1];
  11339.         item.date = bits.match(/\d{4}/)[0];
  11340.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="description"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11341.         item.complete();
  11342.     }, function() {Zotero.done;});
  11343.     Zotero.wait();
  11344. }');
  11345.  
  11346. REPLACE INTO translators VALUES ('a75e0594-a9e8-466e-9ce8-c10560ea59fd', '1.0.0b4.r5', '', '2008-05-15 18:30:00', '0', '100', '4', 'Columbia University Press', 'Michael Berkowitz', 'http://www.cup.columbia.edu/', 
  11347. 'function detectWeb(doc, url) {
  11348.     if (url.match(/book\//)) {
  11349.         return "book";
  11350.     } else if (doc.evaluate(''//p[@class="header"]/a/span[@class="_booktitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11351.         return "multiple";
  11352.     }
  11353. }', 
  11354. 'function addTag(item, tag, xpath) {
  11355.     item[tag] = Zotero.Utilities.trimInternal(doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11356. }
  11357.  
  11358. function doWeb(doc, url) {
  11359.     var n = doc.documentElement.namespaceURI;
  11360.     var ns = n ? function(prefix) {
  11361.         if (prefix == ''x'') return n; else return null;
  11362.     } : null;
  11363.     
  11364.     var books = new Array();
  11365.     
  11366.     if (detectWeb(doc, url) == "multiple") {
  11367.         var items = new Object();
  11368.         var titles = doc.evaluate(''//p[@class="header"]/a'', doc, ns, XPathResult.ANY_TYPE, null);
  11369.         var title;
  11370.         while (title = titles.iterateNext()) {
  11371.             items[title.href] = title.textContent;
  11372.         }
  11373.         items = Zotero.selectItems(items);
  11374.         for (var i in items) {
  11375.             books.push(i);
  11376.         }
  11377.     } else {
  11378.         books = [url];
  11379.     }
  11380.     Zotero.Utilities.processDocuments(books, function(doc) {
  11381.         var item = new Zotero.Item("book");
  11382.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//h1[@id="_booktitle"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11383.         var authors = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@id="_authors"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11384.         if (authors.match(/Edited/)) {
  11385.             authors = Zotero.Utilities.trimInternal(authors.replace("Edited by", ""));
  11386.             var autType = "editor";
  11387.         } else {
  11388.             var autType = "author";
  11389.         }
  11390.         var auts = authors.split(/,|\band\b/);
  11391.         for each (var aut in auts) {
  11392.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, autType));
  11393.         }
  11394.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@id="_desc"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11395.         item.date = Zotero.Utilities.trimInternal(doc.evaluate(''//span[@id="_publishDate"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11396.         item.ISBN = Zotero.Utilities.trimInternal(doc.evaluate(''//span[@id="_isbn"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11397.         item.publisher = Zotero.Utilities.trimInternal(doc.evaluate(''//span[@id="_publisher"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11398.         item.complete();
  11399.     }, function() {Zotero.done;});
  11400.     Zotero.wait();
  11401. }');
  11402.  
  11403. REPLACE INTO translators VALUES ('0c661209-5ec8-402b-8f18-7dec6ae37d95', '1.0.0b4.r5', '', '2008-05-15 00:30:00', '0', '100', '4', 'The Free Dictionary', 'Michael Berkowitz', 'http://(.*\.)?thefreedictionary.com/(\w+)', 
  11404. 'function detectWeb(doc, url) {
  11405.     return "dictionaryEntry";
  11406. }', 
  11407. 'function doWeb(doc, url) {
  11408.     var item = new Zotero.Item(''dictionaryEntry'');
  11409.     item.title = Zotero.Utilities.capitalizeTitle(url.replace("+", " ").match(/[^/]+$/)[0]);
  11410.     item.dictionaryTitle = "The Free Dictionary";
  11411.     var defs = doc.evaluate(''//div[@class="pseg"]'', doc, null, XPathResult.ANY_TYPE, null);
  11412.     var def;
  11413.     while (def = defs.iterateNext()) {
  11414.         item.notes.push({note:Zotero.Utilities.trimInternal(def.textContent)});
  11415.     }
  11416.     item.url = 
  11417.     item.complete();
  11418. }');
  11419.  
  11420. REPLACE INTO translators VALUES ('46291dc3-5cbd-47b7-8af4-d009078186f6', '1.0.0b4.r5', '', '2008-05-15 00:30:00', '0', '100', '4', 'CiNii', 'Michael Berkowitz', 'http://ci.nii.ac.jp/naid/', 
  11421. 'function detectWeb(doc, url) {
  11422.     if (url.match(/(naid|QuotDisp)/)) {
  11423.         return "journalArticle";
  11424.     } else if (doc.evaluate(''//a[contains(@href, "QuotDisp") or contains(@href, "/naid/")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11425.         return "multiple";
  11426.     }
  11427. }', 
  11428. 'function doWeb(doc, url) {
  11429.     var n = doc.documentElement.namespaceURI;
  11430.     var ns = n ? function(prefix) {
  11431.         if (prefix == ''x'') return n; else return null;
  11432.     } : null;
  11433.     var arts = new Array();
  11434.     if (detectWeb(doc, url) == "multiple") {
  11435.         var items = new Object();
  11436.         var links = doc.evaluate(''//a[contains(@href, "QuotDisp") or contains(@href, "/naid/")]'', doc, ns, XPathResult.ANY_TYPE, null);
  11437.         var link;
  11438.         while (link = links.iterateNext()) {
  11439.             items[link.href] = Zotero.Utilities.trimInternal(link.textContent);
  11440.         }
  11441.         items = Zotero.selectItems(items);
  11442.         for (var i in items) {
  11443.             arts.push(i);
  11444.         }
  11445.     } else {
  11446.         arts = [url];
  11447.     }
  11448.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11449.         var biblink = doc.evaluate(''//a[contains(text(), "BibTex")]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11450.         var newurl = doc.location.href;
  11451.         var tags = new Array();
  11452.         if (doc.evaluate(''//a[@class="keyword"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11453.             var kws = doc.evaluate(''//a[@class="keyword"]'', doc, ns, XPathResult.ANY_TYPE, null);
  11454.             var kw;
  11455.             while (kw = kws.iterateNext()) {
  11456.                 tags.push(Zotero.Utilities.trimInternal(kw.textContent));
  11457.             }
  11458.         }
  11459.         Zotero.Utilities.HTTP.doGet(biblink, function(text) {
  11460.             var trans = Zotero.loadTranslator("import");
  11461.             trans.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  11462.             trans.setString(text);
  11463.             trans.setHandler("itemDone", function(obj, item) {
  11464.                 item.url = newurl;
  11465.                 item.attachments = [{url:item.url, title:item.title + " Snapshot", mimeType:"text/html"}];
  11466.                 item.tags = tags;
  11467.                 item.complete();    
  11468.             });
  11469.             trans.translate();
  11470.         });
  11471.     }, function() {Zotero.done;});
  11472.     Zotero.wait();
  11473. }');
  11474.  
  11475. REPLACE INTO translators VALUES ('75edc5a1-6470-465a-a928-ccb77d95eb72', '1.0.0b4.r5', '', '2008-05-12 19:00:00', '0', '100', '4', 'American Institute of Aeronautics and Astronautics', 'Michael Berkowitz', 'http://www.aiaa.org/', 
  11476. 'function detectWeb(doc, url) {
  11477.     if (doc.evaluate(''//td/div[@class="title"]/b/div[@class="centerHeadlines"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11478.         return "multiple";
  11479.     }
  11480. }', 
  11481. 'function doWeb(doc, url) {
  11482.     var n = doc.documentElement.namespaceURI;
  11483.     var ns = n ? function(prefix) {
  11484.         if (prefix == ''x'') return n; else return null;
  11485.     } : null;
  11486.     
  11487.     var items = new Object();
  11488.     var oldItems = doc.evaluate(''//table/tbody/tr/td[div[@class="title"]]'', doc, ns, XPathResult.ANY_TYPE, null);
  11489.     var nextItem;
  11490.     while (nextItem = oldItems.iterateNext()) {
  11491.         var data = new Object();
  11492.         data[''title''] = Zotero.Utilities.trimInternal(doc.evaluate(''./div[@class="title"]//div[@class="centerHeadlines"]'', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11493.         data[''pages''] = Zotero.Utilities.trimInternal(doc.evaluate(''./div[@class="title"]//div[@class="centerHeadlinesSub2"]'', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/[\d\w]+\-[\d\w]+/)[0]);
  11494.         data[''authors''] = Zotero.Utilities.trimInternal(doc.evaluate(''./ul/i'', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11495.         var extra = Zotero.Utilities.trimInternal(doc.evaluate(''./ul'', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11496.         var extra = extra.replace(data[''authors''], "");
  11497.         data[''extra''] = Zotero.Utilities.trimInternal(extra);
  11498.         var pdf = doc.evaluate(''.//a'', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().href;
  11499.         Zotero.debug(pdf);
  11500.         data[''pdfurl''] = pdf;
  11501.         items[data[''title'']] = data;
  11502.     }
  11503.     var volume;
  11504.     var issue;
  11505.     var date;
  11506.     if (doc.evaluate(''//td[2]/table/tbody/tr/td[1]/strong'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11507.         var voliss = Zotero.Utilities.trimInternal(doc.evaluate(''//td[2]/table/tbody/tr/td[1]/strong'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11508.         voliss = voliss.match(/(\d+)\s+vol\.\s*(\d+)\s+no\.\s*(\d+)/);
  11509.         volume = voliss[2];
  11510.         issue = voliss[3];
  11511.         date = voliss[1];
  11512.     } else if (doc.evaluate(''//select'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11513.         var voliss = Zotero.Utilities.trimInternal(doc.evaluate(''//select[@name="volume"]/option[@selected]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11514.         var issue = Zotero.Utilities.trimInternal(doc.evaluate(''//select[@name="issue"]/option[@selected]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11515.         voliss = voliss.match(/vol\.\s*(\d+)\s*\-\s*(\d+)/);
  11516.         volume = voliss[1];
  11517.         date = voliss[2];
  11518.     }
  11519.     if (doc.evaluate(''//tr[1]/td/b/div[@class="centerHeadlines"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11520.         var journal = Zotero.Utilities.trimInternal(doc.evaluate(''//tr[1]/td/b/div[@class="centerHeadlines"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11521.         var ISSN = Zotero.Utilities.trimInternal(doc.evaluate(''//tr[1]/td/font[@class="centerHeadlinesSub2"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/(\(|\))/g, ""));
  11522.     } else if (doc.evaluate(''//div[@class="centerHeadlinesTitle"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) {
  11523.         var journal = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@class="centerHeadlinesTitle"]'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11524.         var ISSN = Zotero.Utilities.trimInternal(doc.evaluate(''//tr/td[1]/table/tbody/tr[2]/td/div'', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/ISSN\s*([\d\-]+)/)[1]);
  11525.     }
  11526.     var searchItems = new Array();
  11527.     for (var i in items) {
  11528.         searchItems.push(i);
  11529.     }
  11530.  
  11531.     searchItems = Zotero.selectItems(searchItems);
  11532.     for (var i in items) {
  11533.         for each (var title in searchItems) {
  11534.             if (i == title) {
  11535.                 var data = items[i];
  11536.                 var item = new Zotero.Item("journalArticle");
  11537.                 item.volume = volume;
  11538.                 item.issue = issue;
  11539.                 item.date = date;
  11540.                 item.title = data[''title''];
  11541.                 item.pages = data[''pages''];
  11542.                 item.publicationTitle = Zotero.Utilities.capitalizeTitle(journal);
  11543.                 item.ISSN = ISSN;
  11544.                 if (data[''authors''].match(/\w+/)) {
  11545.                     var authors = data[''authors''].split(/(\band\b|,|;)/);
  11546.                     for each (var aut in authors) {
  11547.                         if (aut.match(/\w+/) && aut != "and") {
  11548.                             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  11549.                         }
  11550.                     }
  11551.                 }
  11552.                 item.attachments = [{url:data[''pdfurl''], title:"AIAA PDF (first page)", mimeType:"application/pdf"}];
  11553.                 item.complete();
  11554.             }
  11555.         }
  11556.     }
  11557. }');
  11558.  
  11559. REPLACE INTO translators VALUES ('635c1246-e0c8-40a0-8799-a73a0b013ad8', '1.0.0b4.r5', '', '2008-05-09 23:15:00', '0', '100', '4', 'Bryn Mawr Classical Review', 'Michael Berkowitz', 'http://ccat.sas.upenn.edu/bmcr/', 
  11560. 'function detectWeb(doc, url) {
  11561.     if (url.match(/by_reviewer/) || url.match(/by_author/) || url.match(/recent.html/) || url.match(/\/\d{4}\/$/)) {
  11562.         return "multiple";
  11563.     } else if (url.match(/[\d\-]+\.html$/)) {
  11564.         return "journalArticle";
  11565.     }
  11566. }', 
  11567. 'function doWeb(doc, url) {
  11568.     var ns = doc.documentElement.namespaceURI;
  11569.     var nsResolver = ns ? function(prefix) {
  11570.         if (prefix == ''x'') return ns; else return null;
  11571.     } : null;
  11572.     var arts = new Array();
  11573.     if (detectWeb(doc, url) == "multiple") {
  11574.         var items = new Object();
  11575.         if (doc.evaluate(''//table/tbody/tr/td/ul/li/i'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11576.             var boxes = doc.evaluate(''//table/tbody/tr/td/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11577.             var box;
  11578.             while (box = boxes.iterateNext()) {
  11579.                 var link = doc.evaluate(''./a'', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  11580.                 var title = doc.evaluate(''./i'', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11581.                 items[link] = title;
  11582.             }
  11583.         } else if (doc.evaluate(''//table/tbody/tr/td/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11584.             var title = doc.evaluate(''//table/tbody/tr/td/ul/li'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11585.             var next;
  11586.             while (next = title.iterateNext()) {
  11587.                 items[next.href]  = Zotero.Utilities.trimInternal(next.textContent);
  11588.             }
  11589.         } else if (url.match(/google\.com/)) {
  11590.             var titles = doc.evaluate(''//h2[@class="r"]/a[@class="l"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11591.             var title;
  11592.             while (title = titles.iterateNext()) {
  11593.                 items[title.href] = title.textContent;
  11594.             }
  11595.         }
  11596.         items = Zotero.selectItems(items);
  11597.         for (var i in items) {
  11598.             arts.push(i);
  11599.         }
  11600.     } else {
  11601.         arts = [url];
  11602.     }
  11603.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11604.         var item = new Zotero.Item("journalArticle");
  11605.         var title = doc.evaluate(''//h3/i'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11606.         item.title = "Review of: " + Zotero.Utilities.trimInternal(title);
  11607.         var data = doc.evaluate(''//h3[i]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11608.         var title = title.replace("(", "\\(").replace(")", "\\)");
  11609.         var author = doc.evaluate(''//b[contains(text(), "Reviewed")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Reviewed by\s+([^,]+),/)[1];
  11610.         item.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  11611.         var splitRe = new RegExp(title);
  11612.         var authors = data.split(splitRe)[0].replace(/\([^)]+\)/, "").split(/(,|and)\s+/);
  11613.         Zotero.debug(authors);
  11614.         Zotero.debug(authors);
  11615.         for each (var aut in authors) {
  11616.             if (aut.match(/\w/) && (aut != "and")) {
  11617.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "reviewedAuthor"));
  11618.             }
  11619.         }
  11620.         item.url = doc.location.href;
  11621.         item.attachments = [{url:item.url, title:item.title, mimeType:"text/html"}];
  11622.         if (doc.evaluate(''/html/body/center/table/tbody/tr/td/center/table/tbody/tr/td/center/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11623.             item.date = Zotero.Utilities.trimInternal(doc.evaluate(''/html/body/center/table/tbody/tr/td/center/table/tbody/tr/td/center/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Bryn Mawr Classical Review ", "").replace(/\./g, "/"));
  11624.         } else {
  11625.             item.date = Zotero.Utilities.trimInternal(doc.evaluate(''/html/body/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Bryn Mawr Classical Review ", "").replace(/\./g, "/"))
  11626.         }
  11627.         item.complete();
  11628.     }, function() {Zotero.done;});
  11629.     Zotero.wait();
  11630. }');
  11631.  
  11632. REPLACE INTO translators VALUES ('9499c586-d672-42d6-9ec4-ee9594dcc571', '1.0.0b4.r5', '', '2008-05-08 20:30:00', '0', '100', '4', 'The Hindu', 'Prashant Iyengar and Michael Berkowitz', 'http://(www.)?hindu.com', 
  11633. 'function detectWeb(doc, url) {
  11634.     if (doc.evaluate(''//h2[@class="r"]/a[@class="l"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11635.               return "multiple";
  11636.           } else {
  11637.               return "newspaperArticle";
  11638.     }
  11639. }
  11640.    ', 
  11641. 'function regexMeta(str, item) {
  11642.     var re = /NAME\=\"([\w\W]*?)\"\s+CONTENT\=\"([\w\W]*?)\"/;
  11643.     var stuff = str.match(re);
  11644.         if (stuff)
  11645.         {
  11646.         if (stuff[1] == "PAGEHEAD") {
  11647.         item.section = stuff[2].split(/\s+/)[0];
  11648.     }
  11649.     if (stuff[1] == "ZONE") {
  11650.         item.place = stuff[2].split(/\s+/)[0];
  11651.     }
  11652.     if (stuff[1] == "PAGENUMBER") {
  11653.         item.pages = stuff[2].split(/\s+/)[0];
  11654.     }
  11655.     
  11656.     
  11657.     
  11658.     }
  11659. }
  11660.  
  11661.  
  11662.  
  11663. function doWeb(doc, url) {
  11664.     var arts = new Array();
  11665.     if (detectWeb(doc, url) == "multiple") {
  11666.         var xpath = ''//h2[@class="r"]/a[@class="l"]'';
  11667.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  11668.         var link;
  11669.         var items = new Object();
  11670.         while (link = links.iterateNext()) {
  11671.             items[link.href] = link.textContent;
  11672.         }
  11673.         items = Zotero.selectItems(items);
  11674.         for (var i in items) {
  11675.             arts.push(i);
  11676.         }
  11677.         
  11678.     } else { arts = [url]; }
  11679.     for each (var art in arts) {
  11680.         Zotero.debug(art);
  11681.         Zotero.Utilities.HTTP.doGet(art, function(text) {
  11682.             var newItem = new Zotero.Item("newspaperArticle");
  11683.             newItem.publicationTitle = "The Hindu";
  11684.             newItem.url = art;
  11685.             //title
  11686.             var t = /\<TITLE\>[\w\W]*\:([\w\W]*?)<\/TITLE/;
  11687.             newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1]));
  11688.     
  11689.                             var ti = /\<FONT color\=black\>(.*)?\<\/FONT\>/;
  11690.             newItem.date = text.match(ti)[1];
  11691.             
  11692.             var auth =     /\<font class\=storyhead[\w\W]*?justify\>([\w\W]*?)\<p\>/;
  11693.             if (text.match(auth))
  11694.             {
  11695.             //newItem.author=Zotero.Utilities.cleanAuthor(text.match(auth)[1]);
  11696.             cleanauth=Zotero.Utilities.cleanTags(text.match(auth)[1]);
  11697.             newItem.creators.push(Zotero.Utilities.cleanAuthor(cleanauth, "author"));
  11698.             
  11699.             }
  11700.     
  11701.             newItem.websiteTitle="The Hindu";
  11702.             newItem.edition="Online";
  11703.     
  11704.             //hooray for real meta tags!
  11705.             var meta = /<META NAME[\w\W]*?\>/g;
  11706.             var metaTags = text.match(meta);
  11707.             for (var i = 0 ; i <metaTags.length ; i++) {
  11708.                 regexMeta(metaTags[i], newItem);
  11709.             }
  11710.             newItem.complete();
  11711.             Zotero.done();
  11712.         });
  11713.         Zotero.wait();
  11714.     }
  11715. }');
  11716.  
  11717. REPLACE INTO translators VALUES ('e8d40f4b-c4c9-41ca-a59f-cf4deb3d3dc5', '1.0.0b4.r5', '', '2008-05-08 20:30:00', '0', '100', '4', 'Business Standard', 'Prashant Iyengar and Michael Berkowitz', 'http://www.business-standard.com', 
  11718. 'function detectWeb(doc, url) {
  11719.     if (url.match(/googlesearch/)) {
  11720.         return "multiple";
  11721.     } else if (url.match(/common/)) {
  11722.         return "newspaperArticle";
  11723.     }
  11724. }', 
  11725. 'function doWeb(doc, url) {
  11726.     var arts = new Array();
  11727.     if (detectWeb(doc, url) == "multiple") {
  11728.         var links = doc.evaluate(''//a[@class="NewsHead"]'', doc, null, XPathResult.ANY_TYPE, null);
  11729.         var link;
  11730.         var items = new Object();
  11731.         while (link = links.iterateNext()) {
  11732.             items[link.href] = Zotero.Utilities.cleanTags(link.textContent);
  11733.         }
  11734.         items = Zotero.selectItems(items);
  11735.         for (var i in items) {
  11736.             arts.push(i);
  11737.         }
  11738.     } else {
  11739.         arts = [url];
  11740.     }
  11741.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11742.         var newItem = new Zotero.Item("newspaperArticle");
  11743.         newItem.publicationTitle = "The Business Standard";
  11744.         newItem.url = doc.location.href;
  11745.         newItem.websiteTitle="The Business Standard";
  11746.         newItem.edition="Online";
  11747.         newItem.title = Zotero.Utilities.cleanTags(doc.title);
  11748.  
  11749.                         
  11750.         if (doc.evaluate(''//td[@class="author"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11751.             var bits = doc.evaluate(''//td[@class="author"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\s+\/\s+/);
  11752.             newItem.creators.push(Zotero.Utilities.cleanAuthor(bits[0], "author"));
  11753.             extras = Zotero.Utilities.trimInternal(bits[1]).match(/^(.*)(\s\w+\s+\d+,\s*\d+)$/);
  11754.             newItem.place = extras[1];
  11755.             newItem.date = Zotero.Utilities.trimInternal(extras[2]);
  11756.             newItem.complete();
  11757.         } else if (doc.evaluate(''//td[@class="NewsSummary"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11758.             var author = Zotero.Utilities.trimInternal(doc.evaluate(''//td[@class="NewsSummary"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11759.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  11760.             var printurl = ''http://www.business-standard.com/general/printpage.php?autono='' + newItem.url.match(/autono=(\d+)/)[1];
  11761.             Zotero.debug(printurl);
  11762.             Zotero.Utilities.HTTP.doGet(printurl, function(text) {
  11763.                 var date = text.match(/<td class=author>([^<]+)</)[1];
  11764.                 newItem.date = Zotero.Utilities.trimInternal(date.split(" ")[1]);
  11765.                 newItem.complete();
  11766.             });
  11767.         }
  11768.     }, function() {Zotero.done;});
  11769.     Zotero.wait();
  11770. }
  11771. ');
  11772.  
  11773. REPLACE INTO translators VALUES ('fe39e97d-7397-4f3f-a5f3-396a1a79213c', '1.0.0b4.r5', '', '2008-05-08 20:30:00', '0', '100', '4', 'OpenJudis - Indian Supreme Court cases', 'Prashant Iyengar and Michael Berkowitz', 'http://(www.)?openarchive.in/(judis|newcases)', 
  11774. 'function detectWeb(doc, url) {
  11775.     if (doc.evaluate(''//div[@id="footer"]/dl/dt/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  11776.         return "multiple";
  11777.     } else if (url.match(/\d+\.htm/)) {
  11778.         return "case";
  11779.     }
  11780. }', 
  11781. 'function regexMeta(stuff, item) {    
  11782.         if (stuff) {
  11783.                 if (stuff[0] == "Origlink") {
  11784.             item.source = stuff[1].split(/\s+/)[0];
  11785.             }
  11786.         if (stuff[0] == "Acts") {
  11787.             if (stuff[1].indexOf("|")!=-0) {
  11788.                 echts=stuff[1].split(" | ");
  11789.                 for (i=0;i<echts.length;i++) {
  11790.                     item.tags.push(echts[i]);
  11791.                 }
  11792.                 } else {
  11793.                     item.tags.push(stuff[1]);
  11794.                 }
  11795.             }
  11796.         if (stuff[0] == "Citations" && stuff[1].length > 1) {
  11797.             item.reporter=stuff[1];
  11798.         }
  11799.         if (stuff[0] == "Judges") {
  11800.             if (stuff[1].indexOf(";")!=-0) {
  11801.                 jedges=stuff[1].split(" ; ");
  11802.                 for (i=0;i<jedges.length;i++) {
  11803.                            item.creators.push(Zotero.Utilities.cleanAuthor(jedges[i], "author"));
  11804.                     }
  11805.                 } else {
  11806.                     item.creators.push(Zotero.Utilities.cleanAuthor(stuff[1], "author"));
  11807.                 }
  11808.         }
  11809.             if (stuff[0] == "Jday") {
  11810.                    item.dateDecided= stuff[1];
  11811.         }
  11812.     }
  11813. }
  11814.  
  11815.  
  11816.  
  11817. function doWeb(doc, url) {
  11818.     var arts = new Array();
  11819.     if (detectWeb(doc, url) == "multiple") {
  11820.         var items = Zotero.Utilities.getItemArray(doc, doc, "^http:\/\/openarchive\.in\/[^/]+\/[0-9]+.htm$");
  11821.         items = Zotero.selectItems(items);
  11822.         for (var i in items) {
  11823.             arts.push(i);
  11824.         }
  11825.     } else { arts = [url]; }
  11826.     Zotero.debug(arts);
  11827.     for each (var art in arts) {
  11828.         var newurl = art;
  11829.         Zotero.Utilities.HTTP.doGet(art, function(text) {
  11830.             var newItem = new Zotero.Item("case");
  11831.             newItem.publicationTitle = "OpenJudis - http://judis.openarchive.in";
  11832.             newItem.url = url;
  11833.             
  11834.             //title
  11835.             var t = /\<title\>([\w\W]*?)<\/title/;
  11836.             newItem.title = Zotero.Utilities.trimInternal(t.exec(text)[1]);
  11837.             newItem.caseName = newItem.title;
  11838.             newItem.url = newurl;
  11839.             newItem.court="The Supreme Court of India";
  11840.     
  11841.             newItem.websiteTitle="OpenJudis - http://judis.openarchive.in";
  11842.             newItem.edition="Online";
  11843.             
  11844.             var metareg = /<META NAME[^>]+\>/g;
  11845.             var tags = text.match(metareg);
  11846.             for each (var tag in tags) {
  11847.                 var stuff = tag.match(/NAME=\"([^"]+)\"\s+CONTENT=\"([^"]+)\"/);
  11848.                 regexMeta([stuff[1], stuff[2]], newItem);
  11849.             }
  11850.             pdfurl = ''http://judis.openarchive.in/makepdf.php?filename='' + newItem.url;
  11851.             newItem.attachments = [
  11852.                 {url:newItem.url, title:"OpenJudis Snapshot", mimeType:"text/html"},
  11853.                 {url:pdfurl, title:"OpenJudis PDF", mimeType:"application/pdf"}
  11854.             ];
  11855.             newItem.complete();
  11856.         }, function() {Zotero.done;});
  11857.         Zotero.wait();
  11858.     }
  11859. }
  11860. ');
  11861.  
  11862. REPLACE INTO translators VALUES ('c0d7d260-d795-4782-9446-f6c403a7922c', '1.0.0b4.r5', '', '2008-05-08 20:30:00', '0', '100', '4', 'Science Links Japan', 'Michael Berkowitz', 'http://sciencelinks.jp/', 
  11863. 'function detectWeb(doc, url) {
  11864.     if (url.match(/result/) || url.match(/journal/)) {
  11865.         return "multiple";
  11866.     } else if (url.match(/article/)) {
  11867.         return "journalArticle";
  11868.     }
  11869. }', 
  11870. 'function doWeb(doc, url) {
  11871.     var ns = doc.documentElement.namespaceURI;
  11872.     nsR = ns ? function(prefix) {
  11873.         if (prefix == ''x'') return ns; else return null;
  11874.     } : null;
  11875.     
  11876.     var arts = new Array();
  11877.     if (detectWeb(doc, url) == "multiple") {
  11878.         var items = Zotero.Utilities.getItemArray(doc, doc, "(article|display\.php)");
  11879.         items = Zotero.selectItems(items);
  11880.         for (var i in items) {
  11881.             arts.push(i);
  11882.         }
  11883.     } else {
  11884.         arts = [url];
  11885.     }
  11886.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11887.         var data = new Array();
  11888.         var bits = doc.evaluate(''//div[@id="result_detail"]/table/tbody/tr/td'', doc, nsR, XPathResult.ANY_TYPE, null);
  11889.         var bit;
  11890.         while (bit = bits.iterateNext()) {
  11891.             data.push(Zotero.Utilities.trimInternal(bit.textContent));
  11892.         }
  11893.         var item = new Zotero.Item("journalArticle");
  11894.         for each (var datum in data) {
  11895.             if (datum.match(/^Title;/)) {
  11896.                 item.title = Zotero.Utilities.capitalizeTitle(datum.match(/Title;(.*)$/)[1]);
  11897.             } else if (datum.match(/^Author;/)) {
  11898.                 var auts = datum.match(/\b[A-Z''\-]+\s+[A-Z''\-]+/g);
  11899.                 for each (var aut in auts) {
  11900.                     item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.capitalizeTitle(aut, true), "author"));
  11901.                 }
  11902.             } else if (datum.match(/^Journal Title;/)) {
  11903.                 item.publicationTitle = datum.match(/;(.*)$/)[1];
  11904.             } else if (datum.match(/^ISSN/)) {
  11905.                 item.ISSN = datum.match(/[\d\-]+/)[0];
  11906.             } else if (datum.match(/^VOL/)) {
  11907.                 var voliss = datum.match(/^VOL\.([^;]*);NO\.([^;]*);PAGE\.([^(]*)\((\d+)\)/);
  11908.                 item.volume = voliss[1];
  11909.                 item.issue = voliss[2];
  11910.                 item.pages = voliss[3];
  11911.                 item.date = voliss[4];
  11912.             } else if (datum.match(/^Abstract/)) {
  11913.                 item.abstractNote = datum.match(/;(.*)/)[1];
  11914.             }
  11915.         }
  11916.         item.url = doc.location.href;
  11917.         item.attachments = [{url:item.url, title:"Science Links Japan Snapshot", mimeType:"text/html"}];
  11918.         item.complete();
  11919.     }, function() {Zotero.done;});
  11920.     Zotero.wait();
  11921. }');
  11922.  
  11923. REPLACE INTO translators VALUES ('2cd7d362-5fba-423a-887f-579ed343e751', '1.0.0b4.r5', '', '2008-05-06 08:15:00', '0', '100', '4', 'The Microfinance Gateway', 'Michael Berkowitz', 'http://(www.)?microfinancegateway.org/', 
  11924. 'function detectWeb(doc, url) {
  11925.     if (url.match(/results\.php/) || url.match(/search/)) {
  11926.         return "multiple";
  11927.     } else if (url.match(/content\/article/)) {
  11928.         return "journalArticle";
  11929.     }
  11930. }', 
  11931. 'function doWeb(doc, url) {
  11932.     var ns = doc.documentElement.namespaceURI;
  11933.     var nsResolver = ns ? function (prefix) {
  11934.         if (prefix == ''x'') return ns; else return null;
  11935.     } : null;
  11936.     
  11937.     var arts = new Array();
  11938.     if (detectWeb(doc, url) == "multiple") {
  11939.         var items = Zotero.Utilities.getItemArray(doc, doc, "content/article/detail");
  11940.         items = Zotero.selectItems(items);
  11941.         for (var i in items) {
  11942.             arts.push(i);
  11943.         }
  11944.     } else {
  11945.         arts = [url];
  11946.     }
  11947.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11948.         var item = new Zotero.Item("journalArticle");
  11949.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//td[2][@class="main_content_box"]/h1'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11950.         var authors = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@class="source"]/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(/(\.,|&)/);
  11951.         for each (var aut in authors) {
  11952.             if (aut.match(/\w+/)) {
  11953.                 item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aut), "author", true));
  11954.             }
  11955.         }
  11956.         item.url = doc.location.href;
  11957.         item.date = Zotero.Utilities.trimInternal(doc.evaluate(''//span[@class="date"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11958.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//span[@class="summary"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11959.         var pdfurl = doc.evaluate(''//div[@class="articleTopics"]/div/a[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  11960.         item.publicationTitle = doc.evaluate(''//div[@class="articleTopics"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Published\s+by:\s+(.*)\n/)[1];
  11961.         item.attachments = [
  11962.             {url:item.url, title:item.title + " Snapshot", mimeType:"text/html"},
  11963.             {url:pdfurl, title:item.title + " PDF", mimeType:"application/pdf"}
  11964.         ];
  11965.         
  11966.         item.complete();
  11967.     }, function() {Zotero.done;});
  11968. }');
  11969.  
  11970. REPLACE INTO translators VALUES ('291934d5-36ec-4b81-ac9c-c5ad5313dba4', '1.0.0b4.r5', '', '2008-05-06 08:15:00', '0', '100', '4', 'Pion Journals', 'Michael Berkowitz', 'http://(www.)?(hthpweb|envplan|perceptionweb).com/', 
  11971. 'function detectWeb(doc, url) {
  11972.     if (url.match(/search\.cgi/) || url.match(/ranking/) || url.match(/volume=/)) {
  11973.         return "multiple";
  11974.     } else if (url.match(/abstract\.cgi/)) {
  11975.         return "journalArticle";
  11976.     }
  11977. }', 
  11978. 'function doWeb(doc, url) {
  11979.     var namespace = doc.documentElement.namespaceURI;
  11980.     var nsResolver = namespace ? function(prefix) {
  11981.         if (prefix == ''x'') return namespace; else return null;
  11982.     } : null;
  11983.     
  11984.     var arts = new Array();
  11985.     if (detectWeb(doc, url) == "multiple") {
  11986.         var items = Zotero.Utilities.getItemArray(doc, doc, "abstract.cgi\\?id=");
  11987.         items = Zotero.selectItems(items);
  11988.         for (var i in items) {
  11989.             arts.push(i);
  11990.         }
  11991.     } else {
  11992.         arts = [url];
  11993.     }
  11994.     Zotero.debug(arts);
  11995.     Zotero.Utilities.processDocuments(arts, function(doc) {
  11996.         var item = new Zotero.Item("journalArticle");
  11997.         item.publicationTitle = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="footer"]/div[@class="left"]/i'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11998.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="total"]/p[2]/font/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11999.         var authors = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="total"]/p[3]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(/,\s*/);
  12000.         for each (var aut in authors) {
  12001.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  12002.         }
  12003.         if (doc.evaluate(''//div[@id="title"]/div[@class="left"]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\d+/)) {
  12004.             var voliss = doc.evaluate(''//div[@id="title"]/div[@class="left"]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/(\d+)\s+volume\s+(\d+)\s*\((\d+)\)\s+(pages\s+(.*))?$/);
  12005.             Zotero.debug(voliss);
  12006.             item.date = voliss[1];
  12007.             item.volume = voliss[2];
  12008.             item.issue = voliss[3];
  12009.             if (voliss[5]) item.pages = voliss[5];
  12010.         } else {
  12011.             item.date = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="total"]/p[4]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).match(/(\d+)$/)[1];
  12012.         }
  12013.         item.DOI = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="title"]/div[@class="right"]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(4);
  12014.         
  12015.         if (doc.evaluate(''//a[contains(@href, ".pdf")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) var pdfurl = doc.evaluate(''//a[contains(@href, ".pdf")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  12016.         item.url = doc.location.href;
  12017.         var pub = item.publicationTitle;
  12018.         item.attachments = [{url:item.url, title:pub + " Snapshot", mimeType:"text/html"}];
  12019.         if (pdfurl) item.attachments.push({url:pdfurl, title:pub + " Full Text PDF", mimeType:"application/pdf"});
  12020.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="total"]/p[5]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10);
  12021.         item.complete();
  12022.     }, function() {Zotero.done;});
  12023. }');
  12024.  
  12025. REPLACE INTO translators VALUES ('2e304579-dd7b-4770-85e9-0d724c9b49a5', '1.0.0b4.r5', '', '2008-05-05 07:45:00', '0', '100', '4', 'European Educational Research Journal', 'Michael Berkowitz', 'http://www.wwwords.co.uk/eerj/', 
  12026. 'function detectWeb(doc, url) {
  12027.     if (doc.evaluate(''//div[@id="maincontent"]/table[*//p[@class="articletitle"]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  12028.         return "multiple";
  12029.     }
  12030. }', 
  12031. 'function titleCase(str) {
  12032.     var skipWords = ["but", "or", "yet", "so", "for", "and", "nor", "a", "an", "the", "at", "by", "from", "in", "into", "of", "on", "to", "with", "up", "down", "as"];
  12033.     var words = str.toLowerCase().split(/\s+/);
  12034.     var newstr = "";
  12035.     for each (var word in words) {
  12036.         if (skipWords.indexOf(word.replace(/[^a-zA-Z]+/, "")) != -1) {
  12037.             newstr += " " + word;
  12038.         } else if (word.indexOf("-") != -1) {
  12039.             newword = word.split("-");
  12040.             newstr += " " + newword[0][0].toUpperCase() + newword[0].substr(1) + "-" + newword[1][0].toUpperCase() + newword[1].substr(1);
  12041.         } else {
  12042.             newstr += " " + word[0].toUpperCase() + word.substr(1);
  12043.         }
  12044.     }
  12045.     return Zotero.Utilities.trimInternal(newstr);
  12046. }
  12047.  
  12048. function doWeb(doc, url) {
  12049.     var namespace = doc.documentElement.namespaceURI;
  12050.     var nsResolver = namespace ? function(prefix) {
  12051.         if (prefix == ''x'') return namespace; else return false;
  12052.     } : null;
  12053.     var items = new Object();
  12054.     var titles = doc.evaluate(''//p[@class="articletitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12055.     var title;
  12056.     while (title = titles.iterateNext()) {
  12057.         var text = Zotero.Utilities.trimInternal(title.textContent);
  12058.         items[text] = text;
  12059.     }
  12060.     items = Zotero.selectItems(items);
  12061.     Zotero.debug(items);
  12062.     
  12063.     var articles = doc.evaluate(''//div[@id="maincontent"]/table[*//p[@class="articletitle"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12064.     var art;
  12065.     while (art = articles.iterateNext()) {
  12066.         var title = Zotero.Utilities.trimInternal(doc.evaluate(''.//p[@class="articletitle"]'', art, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12067.         if (items[title]) {
  12068.             var pdfurl = doc.evaluate(''.//a[contains(text(), "FULL TEXT")]'', art, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  12069.             var item = new Zotero.Item("journalArticle");
  12070.             item.publicationTitle = "European Educational Research Journal";
  12071.             item.ISSN = "1474-9041";
  12072.             item.url = url;
  12073.             item.title = title;
  12074.             var voliss = doc.title.match(/\-\s+(.*)$/)[1];
  12075.             voliss = voliss.match(/Volume\s+(\d+)\s+Issue\s+(\d+)\s+\((\d+)\)/);
  12076.             item.volume = voliss[1];
  12077.             item.issue = voliss[2];
  12078.             item.date = voliss[3];
  12079.             
  12080.             var authors = doc.evaluate(''.//tr[2]/td'', art, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12081.             var ibits = doc.evaluate(''.//tr[2]/td//i'', art, nsResolver, XPathResult.ANY_TYPE, null);
  12082.             var ibit = "";
  12083.             var bit;
  12084.             while (bit = ibits.iterateNext()) {
  12085.                 authors = authors.replace(bit.textContent, ",");
  12086.             }
  12087.             authors = authors.split(/\s*(,|&)\s*/);
  12088.             for each (var aut in authors) {
  12089.                 if (aut.match(/\w/)) {
  12090.                     aut = titleCase(Zotero.Utilities.trimInternal(aut));
  12091.                     item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  12092.                 }
  12093.             }
  12094.             item.attachments = [{url:pdfurl, title:"EERJ Full Text PDF", mimeType:"application/pdf"}];
  12095.             item.complete();
  12096.         }
  12097.     }
  12098. }');
  12099.  
  12100. REPLACE INTO translators VALUES ('bdaac15c-b0ee-453f-9f1d-f35d00c7a994', '1.0.0b4.r5', '', '2008-05-05 07:45:00', '0', '100', '4', 'AMS Journals', 'Michael Berkowitz', 'http://www.ams.org/', 
  12101. 'function detectWeb(doc, url) {
  12102.     if (url.match(/jour(nals|search)/)) {
  12103.         return "multiple";
  12104.     } else if (url.match(/\d{4}\-\d{2}\-\d{2}/)) {
  12105.         return "journalArticle";
  12106.     }
  12107. }', 
  12108. 'function doWeb(doc, url) {
  12109.     var namespace = doc.documentElement.namespaceURI;
  12110.     var nsResolver = namespace ? function(prefix) {
  12111.         if (prefix == ''x'') return namespace; else return null;
  12112.     } : null;
  12113.     var articles = new Array();
  12114.     if (detectWeb(doc, url) == "multiple") {
  12115.         var items = new Object();
  12116.         if (url.match(/joursearch/)) {
  12117.             var titlex = ''//table/tbody/tr/td/span[@class="searchResultsArticleTitle"]'';
  12118.             var linkx = ''//table/tbody/tr[td/span[@class="searchResultsArticleTitle"]]//a[contains(text(), "Abstract")]'';
  12119.         } else {
  12120.             var titlex = ''//div[@class="contentList"]/dl/dt[@class="articleTitleInAbstract"]'';
  12121.             var linkx = ''//div[@class="contentList"]/dl/dd/a[contains(text(), "Abstract")]''
  12122.         }
  12123.         var titles = doc.evaluate(titlex, doc, nsResolver, XPathResult.ANY_TYPE, null);
  12124.         var links = doc.evaluate(linkx, doc, nsResolver, XPathResult.ANY_TYPE, null);
  12125.         var title, link;
  12126.         while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  12127.             items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  12128.         }
  12129.         items = Zotero.selectItems(items);
  12130.         for (var i in items) {
  12131.             articles.push(decodeURIComponent(i));
  12132.         }
  12133.     } else {
  12134.         articles = [url];
  12135.     }
  12136.     Zotero.debug(articles);
  12137.     Zotero.Utilities.processDocuments(articles, function(doc) {
  12138.         var item = new Zotero.Item("journalArticle");
  12139.         item.publicationTitle = doc.title;
  12140.         item.ISSN = doc.evaluate(''//span[@class="journalISSN"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\(e\)\s+ISSN:?\s+(.*)\(p\)/)[1];
  12141.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@class="articleTitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12142.         var data = Zotero.Utilities.trimInternal(doc.evaluate(''//p[span[@class="bibDataTag"]][1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12143.         data = data.replace(/(Journal|MSC|Posted|Retrieve)/g, "\n$1");
  12144.         Zotero.debug(data);
  12145.         var authors = data.match(/Author\(s\):\s+(.*)\n/)[1].split(/;\s+/);
  12146.         for each (var aut in authors) {
  12147.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  12148.         }
  12149.         var journalinfo = data.match(/Journal:\s+(.*)\n/)[1].match(/^([^\d]+)(\d+)\s+\((\d+)\),\s+(.*)$/);
  12150.         item.journalAbbreviation = journalinfo[1];
  12151.         item.volume = journalinfo[2];
  12152.         item.pages = journalinfo[4];
  12153.         item.date = Zotero.Utilities.trimInternal(data.match(/Posted:\s+(.*)\n/)[1]);
  12154.         item.url = doc.location.href;
  12155.         item.issue = item.url.match(/(\d+)\/S/)[1];
  12156.         var pdfurl = item.url.replace(/([^/]+)\/home.html$/, "$1/$1.pdf");
  12157.         item.attachments = [
  12158.             {url:item.url, title:item.journalAbbreviation + " Snapshot", mimeType:"text/html"},
  12159.             {url:pdfurl, title:item.journalAbbreviation + " PDF", mimeType:"application/pdf"}
  12160.         ];
  12161.         item.abstract = Zotero.Utilities.trimInternal(doc.evaluate(''//td[@class="bottomCell"]/p[4]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(10));
  12162.         item.complete();
  12163.     }, function() {Zotero.done;});
  12164.     Zotero.wait();
  12165. }');
  12166.  
  12167.  
  12168. REPLACE INTO translators VALUES ('5278b20c-7c2c-4599-a785-12198ea648bf', '1.0.0b4.r5', '', '2009-02-08 22:10:00', 1, 100, 4, 'ARTstor', 'Ameer Ahmed and Michael Berkowitz', 'http://[^/]artstor.org[^/]*',
  12169. 'function detectWeb(doc, url) {
  12170.     if (url.match(/(S|s)earch/) && (doc.evaluate(''//div[@id="thumbContentWrap"]/div'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\w+/))) return "multiple"
  12171. }',
  12172. 'function doWeb(doc, url) {
  12173.     if (url.indexOf("|")!=-1){    
  12174.     scrape(doc, url);
  12175.     }
  12176. }
  12177.  
  12178. function scrape(doc, url){
  12179.     var savedItems = new Array();
  12180.     var saved = 0;
  12181.     var urlstub = url.substring(url.indexOf(''.org/'')+5,url.length);
  12182.     urlstub = url.substring(0,url.indexOf(''.org/'')+5) + urlstub.substring(0, urlstub.indexOf(''/'')+1)
  12183.     var suburl = url.substring(url.indexOf(''|'')+1, url.length);
  12184.         var groupname = suburl.substring(0, suburl.indexOf("|"));
  12185.     var searchterm = ''//*[@id="thumbSubTitle"]'';
  12186.         var stt = doc.evaluate(searchterm, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  12187.     var st = stt.firstChild.nodeValue;
  12188.     var pageNn = ''//*[@id="pageNo"]'';
  12189.     var stt = doc.evaluate(pageNn, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  12190.     var pg;
  12191.           if (stt.value==1){
  12192.             pg = 1;
  12193.         } else if (stt.value==2){
  12194.             pg = 25;
  12195.         } else {
  12196.         pg = ((stt.value-1) * 24) + 1;
  12197.         }
  12198.         var groupid;
  12199.     //check if user is on search page if not construct the query using the 2nd pattern
  12200.     if (groupname.indexOf("search")!=-1){
  12201.         groupid = "1/" + pg + "/24/0?tn=1&name=&id=all&kw=" +st + "&type=1";
  12202.     }else {
  12203.         groupid = suburl.substring(suburl.indexOf(''|'')+1, suburl.indexOf(''||'')) + "//thumbnails/" + pg + "/24/0";
  12204.     }
  12205.     // Initial query to get results from the service - primary purpose is to get objectids. which in turn are required for the 2nd service call, which exposes the actual metadata
  12206.     Zotero.Utilities.HTTP.doGet(urlstub + "secure/" + groupname + "//" + groupid, function(text) {
  12207.         var json = JSON.parse(text);
  12208.         items = new Object();
  12209.         for(var i=0; i<json.thumbnails.length; i++) {
  12210.         child = json.thumbnails[i];
  12211.         var tmpUrl = urlstub + "secure/metadata/" + child.objectId + "?_method=Infolder";
  12212.         //here we are saving the url service call to get each objects metadata
  12213.         savedItems[saved] = tmpUrl;
  12214.         items[tmpUrl]=child.objectId;
  12215.         saved++;
  12216.     }
  12217.     // GET VALUES FROM THE WEB
  12218.     var xpath = ''//div[@id="thumbContentWrap"]'';
  12219.     var elmts = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  12220.     var webitems = new Object();
  12221.     var selectedNums = new Array();
  12222.     var si=0;
  12223.     var c = elmts.getElementsByTagName(''*'');
  12224.     var title = "";
  12225.     for(var i=0; i<c.length; i++) {
  12226.         var child = c[i];
  12227.         if (child.id.indexOf("_imageHolder")!=-1){
  12228.             var csss = child.style;
  12229.             var glow = csss.getPropertyValue(''border'');
  12230.         }
  12231.         if (child.id.indexOf("_thumb1")!=-1){
  12232.             title = child.title;
  12233.         }
  12234.         if (child.id.indexOf("_thumb2")!=-1){
  12235.             title+= " :: " + child.title;
  12236.         }
  12237.         if (child.id.indexOf("_thumb3")!=-1){
  12238.             var childtitle = child.title;
  12239.             var dialogTitle = title;
  12240.             if (childtitle.length>1) {
  12241.                 dialogTitle+="  " + childtitle;
  12242.             }
  12243.                 var sitem = child.id.substring(6,child.id.indexOf("_"));
  12244.             webitems[sitem-1] = dialogTitle;
  12245.             if (glow.indexOf(75)!=-1){
  12246.                 selectedNums[si]=sitem-1;
  12247.                 si++;
  12248.             }
  12249.              title = null;
  12250.         }
  12251.     }
  12252.     // GET VALUES FROM THE WEB        
  12253.     var tcount=0;
  12254.     var newitems = null;
  12255.     if (selectedNums.length>0){
  12256.         newitems = new Object();
  12257.         for (j=0; j<selectedNums.length;j++){
  12258.             var numnum = selectedNums[j];
  12259.             for (var x in items){
  12260.                 if (numnum==tcount){
  12261.                     newitems[x] = webitems[tcount];
  12262.                     tcount=0;
  12263.                     break;
  12264.                 } else {
  12265.                     tcount++;
  12266.                 }
  12267.             }
  12268.         }
  12269.     } else {
  12270.         tcount = 0;    
  12271.         for (var x in items){
  12272.             items[x] = webitems[tcount];
  12273.             tcount++;
  12274.         }
  12275.     }
  12276.     if (newitems!=null){
  12277.         items = newitems;
  12278.     }
  12279.     //show dialogbox
  12280.     var items = Zotero.selectItems(items);
  12281.     if(!items) {
  12282.         return true;
  12283.     }
  12284.     var urls = new Array();
  12285.     for(var i in items) {
  12286.         urls.push(i);
  12287.     }
  12288.     //this gets called when an object is selected in the dialog box, fires off a get on the service url
  12289.     Zotero.Utilities.HTTP.doGet(urls, function(text) {
  12290.         json = eval("(" + text + ")");
  12291.         var newArticle = new Zotero.Item(''artwork'');
  12292.         for (var i=0; i<json.metaData.length; i++) {
  12293.             child = json.metaData[i];
  12294.             // MISSING CULTURE!!!        
  12295.             if (child.fieldName.indexOf("Title")!=-1){
  12296.                 if (newArticle.title!=null){
  12297.                     newArticle.title+= ";" + child.fieldValue;
  12298.                 } else {            
  12299.                     newArticle.title = child.fieldValue;
  12300.                 }
  12301.             }
  12302.             if (child.fieldName.indexOf("Creator")!=-1){
  12303.                 if (child.fieldValue != "") {
  12304.                     if (child.fieldValue.match(/,/)) {
  12305.                         var aut = child.fieldValue.match(/^([^,]+),\s+(.*)$/);
  12306.                         if (aut[1].match(/\s/)) {
  12307.                             newArticle.notes.push({note:"Artist information: " + aut[2]});
  12308.                             newArticle.creators.push(Zotero.Utilities.cleanAuthor(aut[1], "artist"));
  12309.                         } else {
  12310.                             var extras = aut[2].match(/^([^,]+),\s+(.*)$/);
  12311.                             newArticle.creators.push({firstName:extras[1], lastName:aut[1], creatorType:"author"});
  12312.                             newArticle.notes.push({note:"Artist information: " + extras[2]});
  12313.                         }
  12314.                     } else {
  12315.                         newArticle.creators.push(Zotero.Utilities.cleanAuthor(child.fieldValue, "artist"));
  12316.                     }
  12317.                 }
  12318.             }
  12319.             if (child.fieldName.indexOf("Culture")!=-1){
  12320.                 newArticle.creators.push(Zotero.Utilities.cleanAuthor(child.fieldValue, "producer", true));
  12321.             }
  12322.             if (child.fieldName.indexOf("Rights")!=-1){
  12323.                 if (newArticle.rights!=null){
  12324.                     newArticle.rights+= ";" + child.fieldValue.replace(/<wbr\/>/g, "");
  12325.                 } else {
  12326.                     newArticle.rights = child.fieldValue.replace(/<wbr\/>/g, "");
  12327.                 }
  12328.             }
  12329.             if (child.fieldName.indexOf("Subject")!=-1){
  12330.                 newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
  12331.             }
  12332.             if (child.fieldName.indexOf("Location")!=-1){
  12333.                 newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
  12334.             }
  12335.             if (child.fieldName.indexOf("Style Period")!=-1){
  12336.                 newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
  12337.             }
  12338.             if (child.fieldName.indexOf("Work Type")!=-1){
  12339.                 newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
  12340.             }
  12341.             if (child.fieldName.indexOf("Material")!=-1 || child.fieldName.indexOf("Technique")!=-1 ){
  12342.                 if (newArticle.artworkMedium!=null){
  12343.                     newArticle.artworkMedium+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12344.                 } else {
  12345.                     newArticle.artworkMedium = Zotero.Utilities.trimInternal(child.fieldValue);
  12346.                 }
  12347.             }
  12348.             if (child.fieldName.indexOf("Measurements")!=-1){
  12349.                 if (newArticle.artworkSize!=null){
  12350.                     newArticle.artworkSize+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12351.                 } else {            
  12352.                     newArticle.artworkSize = Zotero.Utilities.trimInternal(child.fieldValue);
  12353.                 }
  12354.             }
  12355.             if (child.fieldName.indexOf("Date")!=-1){
  12356.                 if (newArticle.date!=null){
  12357.                     newArticle.date+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12358.                 } else {
  12359.                     //bug here!! when date parser fails, entire object is not saved in Zotero - works in Scaffold, fails in Zotero! to patch remove all occurrences of B.C
  12360.                     newArticle.date = Zotero.Utilities.trimInternal(child.fieldValue.replace(/B.C./i, ""));
  12361.                 }
  12362.             }
  12363.             if (child.fieldName.indexOf("Repository")!=-1){
  12364.                 if (newArticle.repository!=null){
  12365.                     newArticle.repository+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12366.                 } else {            
  12367.                     newArticle.repository = Zotero.Utilities.trimInternal(child.fieldValue);
  12368.                 }
  12369.             }
  12370.             if (child.fieldName.indexOf("Source")!=-1){
  12371.                 if (newArticle.archiveLocation!=null){
  12372.                     newArticle.archiveLocation+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12373.                 } else {            
  12374.                     newArticle.archiveLocation = Zotero.Utilities.trimInternal(child.fieldValue);
  12375.                 }
  12376.             }
  12377.             if (child.fieldName.indexOf("Description")!=-1){
  12378.                 if (newArticle.abstractNote!=null){
  12379.                     newArticle.abstractNote+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12380.                 } else {
  12381.                     newArticle.abstractNote = Zotero.Utilities.trimInternal(child.fieldValue);
  12382.                 }
  12383.             }
  12384.             if (child.fieldName.indexOf("Collection")!=-1){
  12385.                 if (newArticle.extra!=null){
  12386.                     newArticle.extra+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
  12387.                 } else {            
  12388.                     newArticle.extra = Zotero.Utilities.trimInternal(child.fieldValue);
  12389.                 }
  12390.             }
  12391.         }
  12392.         var objectId = json.objectId;
  12393.         //this is called to get the url stub for the ARTstor viewer
  12394.         Zotero.Utilities.HTTP.doGet(urlstub + "secure/metadata/" + objectId + "?_method=FpHtml", function(dom) {
  12395.             var testurl = dom.substring(dom.lastIndexOf(''<td class="data">'')+21,dom.lastIndexOf(''</td>'')); 
  12396.             var t2 = "http://www.artstor.org"; 
  12397.             var tmp2 = testurl.replace(/<wbr\/>/g, "");
  12398.             tmp2 = tmp2.substring(0, tmp2.indexOf("&userId"));
  12399.             //build ARTstorImageURL
  12400.             artstorimgurl = t2+tmp2;
  12401.             newArticle.url = artstorimgurl;
  12402.             newArticle.callNumber = objectId;
  12403.             newArticle.complete();
  12404.             Zotero.done();
  12405.         }); 
  12406.         Zotero.wait();
  12407.     });
  12408.     Zotero.wait();
  12409. });
  12410. Zotero.wait();
  12411. }');
  12412.  
  12413.  
  12414. REPLACE INTO translators VALUES ('79f6f9ed-537a-4d4f-8270-c4fbaafdf327', '1.0.0b4.r5', '', '2008-05-05 07:45:00', '0', '100', '4', 'Emerald Publishing', 'Michael Berkowitz', 'www.emeraldinsight.com/', 
  12415. 'function detectWeb(doc, url) {
  12416.     if (url.match(''searchQuickOptions.do'')) {
  12417.         return "multiple"
  12418.     } else if (url.match(''viewContentItem'')) {
  12419.         return "journalArticle";
  12420.     }
  12421. }', 
  12422. 'var tags  = {
  12423.     journal:"publicationTitle",
  12424.     year:"date",
  12425.     volume:"volume",
  12426.     issue:"issue",
  12427.     page:"pages",
  12428.     doi:"DOI",
  12429. //    publisher:"repository",
  12430.     ''article url'':"url",
  12431.     abstract:"abstractNote"
  12432. }
  12433.  
  12434. function doWeb(doc, url) {
  12435.     var namespace = doc.documentElement.namespaceURI;
  12436.     var nsResolver = namespace ? function(prefix) {
  12437.         if (prefix == ''x'') return namespace; else return null;
  12438.     } : null;
  12439.     
  12440.     var arts = new Array();
  12441.     if (detectWeb(doc, url) == "multiple") {
  12442.         var items = new Object();
  12443.         var links = doc.evaluate(''//td[3][@class="resultTd"]/a[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12444.         var link;
  12445.         while (link = links.iterateNext()) {
  12446.             items[link.href] = link.textContent;
  12447.         }
  12448.         items = Zotero.selectItems(items);
  12449.         for (var i in items) {
  12450.             arts.push(i);
  12451.         }
  12452.     } else {
  12453.         arts = [url];
  12454.     }
  12455.     Zotero.Utilities.processDocuments(arts, function(doc) {
  12456.         var item = new Zotero.Item("journalArticle");
  12457.         item.title = Zotero.Utilities.trimInternal(doc.title.split(''-'')[1]);
  12458.         
  12459.         var data = new Object();
  12460.         var values = doc.evaluate(''//div[@class="browseBoxGreen"]/div[@class="toc"]/p[@class="inline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12461.         var fields = doc.evaluate(''//div[@class="browseBoxGreen"]/div[@class="toc"]/h3'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12462.         var value;
  12463.         var field;
  12464.         while ((field = fields.iterateNext()) && (value = values.iterateNext())) {
  12465.             data[Zotero.Utilities.trimInternal(field.textContent.toLowerCase()).replace('':'', '''')] = value.textContent;
  12466.         }
  12467.         var values = doc.evaluate(''//div[@id="centerLeft"]/p[@class="inline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12468.         var fields = doc.evaluate(''//div[@id="centerLeft"]/h3[@class="inline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12469.         while ((field = fields.iterateNext()) && (value = values.iterateNext())) {
  12470.             data[Zotero.Utilities.trimInternal(field.textContent.toLowerCase()).replace('':'', '''')] = value.textContent;
  12471.         }
  12472.         for (var tag in data) {
  12473.             if (tags[tag]) item[tags[tag]] = Zotero.Utilities.trimInternal(data[tag]);
  12474.         }
  12475.         item.attachments = [{url:item.url, title:"Emerald Insight Snapshot", mimeType:"text/html"}];
  12476.         item.tags = Zotero.Utilities.trimInternal(data[''keywords'']).split(/,\s+/);
  12477.         var authors = data[''author(s)''].split(/,\s+/);
  12478.         for each (var aut in authors) {
  12479.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  12480.         }
  12481.         item.complete();
  12482.     }, function() {Zotero.done;});
  12483.     Zotero.wait();
  12484. }');
  12485.  
  12486. REPLACE INTO translators VALUES ('bc39e05b-141a-4322-85f0-a5b86edf896b', '1.0.0b4.r5', '', '2008-05-05 07:45:00', '0', '100', '4', 'Hindawi Publishing Corporation', 'Michael Berkowitz', 'http://www.hindawi.com/', 
  12487. 'function detectWeb(doc, url) {
  12488.     if (url.match(''GetArticle.aspx'')) {
  12489.         return "journalArticle";
  12490.     } else if (Zotero.Utilities.getItemArray(doc, doc, ''GetArticle.aspx'').length != 0) {
  12491.         return "multiple";
  12492.     }
  12493. }', 
  12494. 'function doWeb(doc, url) {
  12495.     var namespace = doc.documentElement.namespaceURI;
  12496.     var nsResolver = namespace ? function(prefix) {
  12497.         if (prefix == ''x'') return namespace; else return null;
  12498.     } : null;
  12499.     
  12500.     var arts = new Array();
  12501.     if (detectWeb(doc, url) == "multiple") {
  12502.         var items = Zotero.Utilities.getItemArray(doc, doc, ''GetArticle.aspx'');
  12503.         items = Zotero.selectItems(items);
  12504.         for (var i in items) {
  12505.             arts.push(i);
  12506.         }
  12507.     } else {
  12508.         arts = [url];
  12509.     }
  12510.     Zotero.Utilities.processDocuments(arts, function(doc) {
  12511.         var item = new Zotero.Item("journalArticle");
  12512.         item.title = doc.title;
  12513.         item.url = doc.location.href;
  12514.         
  12515.         var authorsx = doc.evaluate(''//span/h1/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12516.         var aut;
  12517.         var authors = new Array();
  12518.         while (aut = authorsx.iterateNext()) {
  12519.             var author = aut.textContent;
  12520.             item.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  12521.         }
  12522.         item.doi = item.url.match(/doi=(.*)/)[1];
  12523.         
  12524.         var voliss = doc.evaluate(''//span/pre'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.toLowerCase();
  12525.         if (voliss.match(/volume/)) item.volume = voliss.match(/volume\s+(\d+)/)[1];
  12526.         if (voliss.match(/\(\d+\)/)) item.date = voliss.match(/\((\d+)\)/)[1];
  12527.         if (voliss.match(/issue/)) item.issue = voliss.match(/issue\s+(\d+)/)[1];
  12528.         if (voliss.match(/pages\s+\d+/)) item.pages = voliss.match(/pages\s+([\d\-]+)/)[1];
  12529.         if (voliss.match(/article id/)) item.extra = ''Article ID '' + voliss.match(/article id\s+(\d+)/)[1];
  12530.         
  12531.         var abss = doc.evaluate(''//span/p'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12532.         var absbit;
  12533.         var abs = "";
  12534.         while (absbit = abss.iterateNext()) {
  12535.             abs += absbit.textContent;
  12536.         }
  12537.         abs = Zotero.Utilities.trimInternal(abs);
  12538.         item.abstractNote = abs;
  12539.         item.publicationTitle = doc.evaluate(''//img[@id="ctl00_ImgTitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().alt;
  12540.         item.attachments = [
  12541.             {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"},
  12542.             {url:item.url.replace(''GetArticle'', ''Getpdf''), title:item.publicationTitle + " PDF", mimeType:"application/pdf"}
  12543.         ];
  12544.         item.complete();
  12545.     }, function() {Zotero.done;});
  12546.     Zotero.wait();
  12547. }');
  12548.  
  12549. REPLACE INTO translators VALUES ('252c6a50-0900-41c5-a66b-ec456137c43c', '1.0.0b4.r5', '', '2008-05-05 07:45:00', '0', '100', '4', 'AcademicJournals.net', 'Michael Berkowitz', 'http://www.academicjournals.net/', 
  12550. 'function detectWeb(doc, url) {
  12551.     if (url.match(''articleno='')) {
  12552.         return "journalArticle";
  12553.     } else if (url.match(''issueno='') || url.match(''current.php'')) {
  12554.         return "multiple";
  12555.     }
  12556. }', 
  12557. 'function doWeb(doc, url) {
  12558.     var namespace = doc.documentElement.namespaceURI;
  12559.     var nsResolver = namespace ? function(prefix) {
  12560.         if (prefix == ''x'') return prefix; else return null;
  12561.     } : namespace;
  12562.     
  12563.     var arts = new Array();
  12564.     if (detectWeb(doc, url) == "multiple") {
  12565.         var items = new Object();
  12566.         var titles = doc.evaluate(''//tr[2]/td//table/tbody/tr[1]/td[2]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12567.         var title;
  12568.         var links = doc.evaluate(''//tr[4]/td[2]/div/a[@class="links"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12569.         var link;
  12570.         while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  12571.             items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  12572.         }
  12573.         items = Zotero.selectItems(items);
  12574.         for (var i in items) {
  12575.             arts.push(i);
  12576.         }
  12577.     } else {
  12578.         arts = [url];
  12579.     }
  12580.     Zotero.Utilities.processDocuments(arts, function(doc) {
  12581.         var item = new Zotero.Item("journalArticle");
  12582.         item.url = doc.location.href;
  12583.         //title
  12584.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//td[2]/table/tbody/tr/td/div/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12585.         
  12586.         //voliss, etc.
  12587.         var voliss = doc.evaluate(''//table/tbody/tr/td[2]/font/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12588.         voliss = voliss.match(/^([^\d]+)(\d+)\s+\((\d+)\):\s+([\d\-]+),\s+(\d+)/);
  12589.         Zotero.debug(voliss);
  12590.         item.publicationTitle = voliss[1];
  12591.         item.volume = voliss[2];
  12592.         item.issue = voliss[3];
  12593.         item.pages = voliss[4];
  12594.         item.date = voliss[5];
  12595.         
  12596.         //authors
  12597.         var authorsx = doc.evaluate(''//td[2]/font/a[@class="links"]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12598.         var author;
  12599.         var authors = new Array();
  12600.         while (author = authorsx.iterateNext()) {
  12601.             authors.push(author.textContent);
  12602.         }
  12603.         for each (var aut in authors) {
  12604.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  12605.         }
  12606.         
  12607.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//table/tbody/tr/td/div/table/tbody/tr/td[2]/div/font'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12608.         
  12609.         //attachments
  12610.         var pdfurl = doc.evaluate(''//a[contains(@href, ".pdf")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  12611.         item.attachments = [
  12612.             {url:item.url, title:"AcademicJournals.net Snapshot", mimeType:"text/html"},
  12613.             {url:pdfurl, title:"AcademicJournals.net PDF", mimeType:"application/pdf"}
  12614.         ];
  12615.         
  12616.         //tags
  12617.         var tagspath = doc.evaluate(''//tbody/tr/td/table/tbody/tr[2]/td/font/a[@class="links"]/font'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12618.         var tag;
  12619.         var tags = new Array();
  12620.         while (tag = tagspath.iterateNext()) {
  12621.             tags.push(tag.textContent);
  12622.         }
  12623.         item.tags = tags;
  12624.         item.complete();
  12625.     }, function() {Zotero.done;});
  12626. }');
  12627.  
  12628. REPLACE INTO translators VALUES ('1e1e35be-6264-45a0-ad2e-7212040eb984', '1.0.0b4.r5', '', '2008-06-23 16:45:00', '0', '100', '4', 'APA PsycNET', 'Michael Berkowitz', 'http://psycnet\.apa\.org/', 
  12629. 'function detectWeb(doc, url) {
  12630.     if (url.match(/search\.searchResults/)) {
  12631.         return "multiple";
  12632.     } else if (url.match(/search\.displayRecord/)) {
  12633.         return "journalArticle";
  12634.     }
  12635. }', 
  12636. 'function associateXPath(xpath, doc, ns) {
  12637.     return Zotero.Utilities.trimInternal(doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12638. }
  12639.  
  12640. function doWeb(doc, url) {
  12641.     var namespace = doc.documentElement.namespaceURI;
  12642.     var nsResolver = namespace ? function(prefix) {
  12643.         if (prefix == ''x'') return namespace; else return null;
  12644.     } : null;
  12645.     
  12646.     var arts = new Array();
  12647.     if (detectWeb(doc, url) == "multiple") {
  12648.         var items = new Object();
  12649.         var titles = doc.evaluate(''//div[@class="srhcTitle"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12650.         var title;
  12651.         while (title = titles.iterateNext()) {
  12652.             items[title.href] = title.textContent;
  12653.         }
  12654.         items = Zotero.selectItems(items);
  12655.         for (var i in items) {
  12656.             arts.push(i);
  12657.         }
  12658.     } else {
  12659.         arts = [url];
  12660.     }
  12661.     Zotero.Utilities.processDocuments(arts, function(doc) {
  12662.         var newurl = doc.location.href;
  12663.         if (doc.evaluate(''//input[@name="id"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  12664.             var id = doc.evaluate(''//input[@name="id"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  12665.             var lstSelectedUIDs = doc.evaluate(''//input[@name="lstUIDs"][@id="srhLstUIDs"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  12666.             var get = ''http://psycnet.apa.org/index.cfm?fa=search.export&id='' + id + ''&lstSelectedUIDs='' + lstSelectedUIDs + ''&lstUIDs=&records=selected&displayFormat=&exportFormat=referenceSoftware&printDoc=0'';
  12667.             Zotero.Utilities.HTTP.doGet(get, function(text) {
  12668.                 var translator = Zotero.loadTranslator("import");
  12669.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  12670.                 translator.setString(text);
  12671.                 translator.setHandler("itemDone", function(obj, item) {
  12672.                     item.url = newurl;
  12673.                     item.attachments = [{url:newurl, title:"APA PsycNET Snapshot", mimeType:"text/html"}];
  12674.                     item.complete();
  12675.                 });
  12676.                 translator.translate();
  12677.             });
  12678.         } else {
  12679.             var item = new Zotero.Item("journalArticle");
  12680.             item.title = associateXPath(''//div[@id="rdcTitle"]'', doc, nsResolver);
  12681.             var authors = associateXPath(''//div[@id="rdcAuthors"]'', doc, nsResolver).split(/;\s+/);
  12682.             for each (var aut in authors) {
  12683.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author", true));
  12684.             }
  12685.             var voliss = associateXPath(''//div[@id="rdcSource"]'', doc, nsResolver).match(/^([^\.]+)\.\s+(\d+\s+\w+)\s+Vol\s+(\d+)\((\d+)\)\s+(.*)$/);
  12686.             item.publicationTitle = voliss[1];
  12687.             item.date = voliss[2];
  12688.             item.volume = voliss[3];
  12689.             item.issue = voliss[4];
  12690.             item.pages = voliss[5];
  12691.             item.abstractNote = associateXPath(''//div[@id="rdRecord"]/div[@class="rdRecordSection"][2]'', doc, nsResolver);
  12692.             item.complete();            
  12693.         }
  12694.     }, function() {Zotero.done;});
  12695.     Zotero.wait();
  12696. }');
  12697.  
  12698. REPLACE INTO translators VALUES ('8082115d-5bc6-4517-a4e8-abed1b2a784a', '1.0.0b4.r5', '', '2008-06-29 21:10:00', '0', '100', '4', 'Copernicus2', 'Michael Berkowitz', 'http://www.(adv-sci-res|astrophys-space-sci-trans|atmos-chem-phys|biogeosciences(-discuss)?|clim-past|electronic-earth|hydrol-earth-syst-sci|nat-hazards-earth-syst-sci|nonlin-processes-geophys|ocean-sci|soc-geogr|surv-perspect-integr-environ-soc|the-cryosphere).net/', 
  12699. 'function detectWeb(doc, url) {
  12700.     if (doc.evaluate(''//div[@id="publisher"]/iframe'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//td[*[a[contains(text(), "Abstract")]]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  12701.         return "multiple";
  12702.     } else if (doc.title.match(/Abstract/)) {
  12703.         return "journalArticle";
  12704.     }
  12705. }', 
  12706. 'function getRIS(link) {
  12707.     Zotero.Utilities.HTTP.doGet(link, function(text) {
  12708.         var translator = Zotero.loadTranslator("import");
  12709.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  12710.         translator.setString(text);
  12711.         translator.setHandler("itemDone", function(obj, item) {
  12712.             item.repository = "Copernicus Online Journals";
  12713.             item.attachments[0].title = item.publicationTitle + " Snapshot";
  12714.             item.attachments[0].mimeType = "text/html";
  12715.             item.attachments[1].title = item.publicationTitle + " PDF";
  12716.             item.complete();
  12717.         });
  12718.         translator.translate();
  12719.     });
  12720. }
  12721.  
  12722. function doWeb(doc, url) {
  12723.     var arts = new Array();
  12724.     if (detectWeb(doc, url) == "multiple") {
  12725.         var items = new Object();
  12726.         if (doc.evaluate(''//div[@id="publisher"]/iframe'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  12727.             var link = doc.evaluate(''//div[@id="publisher"]/iframe'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src;
  12728.             Zotero.Utilities.HTTP.doGet(link, function(text) {
  12729.                 var links = text.match(/<a\s+target=\"_top\"\s+href=\"[^"]+\">[^<]+/g);
  12730.                 for each (var link in links) {
  12731.                     link = link.match(/href=\"([^"]+)\">(.*)/);
  12732.                     items[link[1].replace(/\.[^\.]+$/, ".ris")] = Zotero.Utilities.trimInternal(link[2]) + "...";
  12733.                 }
  12734.                 items = Zotero.selectItems(items);
  12735.                 for (var i in items) {
  12736.                     getRIS(i);
  12737.                 }
  12738.             });
  12739.         } else {
  12740.             var titles = doc.evaluate(''//td[*[a[contains(text(), "Abstract")]]]/span[@class="pb_toc_article_title"]'', doc, null, XPathResult.ANY_TYPE, null);
  12741.             var links = doc.evaluate(''//td[*[a[contains(text(), "Abstract")]]]//a[1]'', doc, null, XPathResult.ANY_TYPE, null);
  12742.             var title;
  12743.             var link;
  12744.             while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  12745.                 items[link.href] = title.textContent;
  12746.             }
  12747.             items = Zotero.selectItems(items);
  12748.             for (var i in items) {
  12749.                 getRIS(i.replace(".html", ".ris"));
  12750.             }
  12751.         }
  12752.     } else {
  12753.         getRIS(url.replace(''.html'', ''.ris''));
  12754.     }
  12755.     Zotero.wait();
  12756. }');
  12757.  
  12758. REPLACE INTO translators VALUES ('a8df3cb0-f76c-4e2c-a11e-5fa283f8010c', '1.0.0b4.r5', '', '2008-04-24 14:30:00', '0', '100', '4', 'Copernicus', 'Michael Berkowitz', 'http://www.(adv-geosci|adv-radio-sci|ann-geophys).net/', 
  12759. 'function detectWeb(doc, url) {
  12760.     if (doc.evaluate(''//iframe'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//li[a[contains(text(), "Abstract")]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  12761.         return "multiple";
  12762.     } else if (doc.title.match(/Abstract/)) {
  12763.         return "journalArticle";
  12764.     }
  12765. }', 
  12766. 'function scrape(doc) {
  12767.     var item = new Zotero.Item("journalArticle");
  12768.     item.url = doc.location.href;
  12769.     item.title = doc.evaluate(''//span[@class="inhaltueber_16f"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12770.     item.publicationTitle = doc.evaluate(''//span[@class="ueberschrift"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/)[0];    
  12771.     item.repository = item.publicationTitle;
  12772.     var authors = doc.evaluate(''//td/span[3]/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12773.     authors = authors.replace(/\d/g, "").replace(/,,/, ",").split(/(,|and)/);
  12774.     for each (var aut in authors) {
  12775.         if (!(aut == "and") && (aut.match(/\w/))) {
  12776.             aut = Zotero.Utilities.trimInternal(aut);
  12777.             names = aut.match(/(.*)\s([^\s]+)/);
  12778.             item.creators.push({firstName:names[1], lastName:names[2], creatorType:"author"});
  12779.         }
  12780.     }
  12781.     var voliss = doc.evaluate(''//tr[3]/td/span[@class="lib_small"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12782.     voliss = voliss.match(/^([^,]+),([^,]+),([^,]+),([^w]+)/);
  12783.     item.journalAbbreviation = voliss[1];
  12784.     item.volume = Zotero.Utilities.trimInternal(voliss[2]);
  12785.     item.pages = Zotero.Utilities.trimInternal(voliss[3]);
  12786.     item.year = Zotero.Utilities.trimInternal(voliss[4]);
  12787.     item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//tr[3]/td/span[4]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(10));
  12788.     item.attachments = [
  12789.         {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"},
  12790.         {url:item.url.replace(".html", ".pdf"), title:item.publicationTitle + " PDF", mimeType:"application/pdf"}
  12791.     ];
  12792.     item.complete();
  12793. }
  12794.  
  12795. function doWeb(doc, url) {
  12796.     var arts = new Array();
  12797.     if (detectWeb(doc, url) == "multiple") {
  12798.         var items = new Object();
  12799.         if (doc.evaluate(''//iframe'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  12800.             var link = doc.evaluate(''//iframe'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src;
  12801.             Zotero.Utilities.HTTP.doGet(link, function(text) {
  12802.                 var links = text.match(/<a\s+target=\"_top\"\s+href=\"[^"]+\">[^<]+/g);
  12803.                 for each (var link in links) {
  12804.                     link = link.match(/href=\"([^"]+)\">(.*)/);
  12805.                     items[link[1].replace(/\.[^\.]+$/, ".html")] = Zotero.Utilities.trimInternal(link[2]) + "...";
  12806.                 }
  12807.                 items = Zotero.selectItems(items);
  12808.                 for (var i in items) {
  12809.                     arts.push(i);
  12810.                 }
  12811.                 
  12812.                 Zotero.Utilities.processDocuments(arts, function(doc) {
  12813.                     scrape(doc);
  12814.                 }, function() {Zotero.done;});                
  12815.             });
  12816.         } else {
  12817.             var titles = doc.evaluate(''//li[a[contains(text(), "Abstract")]]/span[@class="articletitle"]'', doc, null, XPathResult.ANY_TYPE, null);
  12818.             var links = doc.evaluate(''//li[a[contains(text(), "Abstract")]]/a[1]'', doc, null, XPathResult.ANY_TYPE, null);
  12819.             var title;
  12820.             var link;
  12821.             while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  12822.                 items[link.href] = title.textContent;
  12823.             }
  12824.             items = Zotero.selectItems(items);
  12825.             for (var i in items) {
  12826.                 arts.push(i);
  12827.             }
  12828.             Zotero.Utilities.processDocuments(arts, function(doc) { scrape(doc);}, function() {Zotero.done;});
  12829.         }
  12830.     } else {
  12831.         Zotero.Utilities.processDocuments([url], function(doc) {
  12832.             scrape(doc);
  12833.         }, function() {Zotero.done;});
  12834.     }
  12835.     Zotero.wait();
  12836. }');
  12837.  
  12838. REPLACE INTO translators VALUES ('f203db7f-7b7b-4dc4-b018-115b7885fe3b', '1.0.0b4.r5', '', '2008-07-10 06:15:00', '0', '100', '4', 'Oxford Music and Art Online', 'Michael Berkowitz', 'http://[^/]*www.oxford(music|art)online.com[^/]*/', 
  12839. 'function detectWeb(doc, url) {
  12840.     if (url.match(/search_results/)) {
  12841.         return "multiple";
  12842.     } else if (url.match(/\/article\//)) {
  12843.         return "journalArticle";
  12844.     }
  12845. }', 
  12846. 'function doWeb(doc, url) {
  12847.     var host = doc.location.host;
  12848.     var site = host.match(/oxford(.*)online/)[1];
  12849.     var ids = new Array();
  12850.     if (detectWeb(doc, url) == "multiple") {
  12851.         var items = new Object();
  12852.         var links = doc.evaluate(''//ul[@class="search_result_list"]/li/p/a'', doc, null, XPathResult.ANY_TYPE, null);
  12853.         var link;
  12854.         while (link = links.iterateNext()) {
  12855.             items[link.href] = link.textContent;
  12856.         }
  12857.         items = Zotero.selectItems(items);
  12858.         for (var i in items) {
  12859.             ids.push(i.match(/(music|art)\/([^?]+)/)[2]);
  12860.         }
  12861.     } else {
  12862.         ids = [url.match(/(music|art)\/([^?]+)/)[2]];
  12863.     }
  12864.     Zotero.debug(ids);
  12865.     for each (var id in ids) {
  12866.         var get = ''http://'' + host + ''/subscriber/article_export_citation/grove/'' + site + ''/'' + id;
  12867.         Zotero.Utilities.HTTP.doGet(get, function(text) {
  12868.             var translator = Zotero.loadTranslator("import");
  12869.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  12870.             translator.setString(text);
  12871.             translator.setHandler("itemDone", function(obj, item) {
  12872.                 var authors = new Array();
  12873.                 for (var i in item.creators) {
  12874.                     names = item.creators[i].lastName.match(/(.*)\s([^\s]+)$/);
  12875.                     authors.push({firstName:names[1], lastName:names[2], creatorType:"author"});
  12876.                 }
  12877.                 item.creators = authors;
  12878.                 item.complete();
  12879.             });
  12880.             translator.translate();
  12881.         });
  12882.     }
  12883. }');
  12884.  
  12885. REPLACE INTO translators VALUES ('ea531652-cdeb-4ec2-940e-627d4b107263', '1.0.0b4.r1', '', '2008-07-10 06:15:00', '0', '100', '4', 'AlterNet', 'Jesse Johnson', '^http://(?:www\.)alternet.org', 
  12886. 'function detectWeb(doc, url) {
  12887.     // identifies articles according to the presence of an article ID
  12888.     // number in the URL
  12889.     var index = url.toString().indexOf(''.org/'') + 5;
  12890.     index += url.toString().substr(index).indexOf(''/'');
  12891.     if (index != -1) {
  12892.         // ordinary aritcle
  12893.         var id = url.toString().substr(index + 1, 5);
  12894.         Zotero.Utilities.cleanString(id);
  12895.         if (Number(id)) {
  12896.             return "magazineArticle";
  12897.         }
  12898.         //columnist or blog article
  12899.         index += url.toString().substr(index + 1).indexOf(''/'');
  12900.         id = url.toString().substr(index + 2, 5);
  12901.         Zotero.Utilities.cleanString(id);
  12902.         if  (Number(id) && url.toString().search(''blog'') == -1) {
  12903.             return "magazineArticle";
  12904.         }
  12905.         else if (Number(id)) {
  12906.             return "blogPost";
  12907.         }
  12908.     }
  12909.     
  12910.     return null;
  12911. }', 
  12912. 'function scrape(doc, url, title) {    
  12913.          var index = url.toString().indexOf(''.org/'') + 5;
  12914.          index += url.toString().substr(index).indexOf(''/'');
  12915.          if (index != -1) {
  12916.              // ordinary aritcle
  12917.              var id = url.toString().substr(index + 1, 5);
  12918.              Zotero.Utilities.cleanString(id);
  12919.              if (Number(id)) { 
  12920.                  var newItem = new Zotero.Item("magazineArticle");
  12921.              }
  12922.              //columnist or blog article
  12923.              index += url.toString().substr(index + 1).indexOf(''/'');
  12924.              id = url.toString().substr(index + 2, 5);
  12925.              Zotero.Utilities.cleanString(id);
  12926.              if  (Number(id) && url.toString().search(''blog'') == -1) {
  12927.                  var newItem = new Zotero.Item("magazineArticle");
  12928.              }
  12929.              else if (Number(id)) {
  12930.                  var newItem = new Zotero.Item("blogPost");
  12931.              }
  12932.          }
  12933.              
  12934.           newItem.url = url;
  12935.          newItem.title = title;
  12936.          
  12937.          if (newItem.itemType == "magazineArticle") {
  12938.              newItem.publicationTitle = "AlterNet";
  12939.              newItem.repository = "alternet.org";
  12940.          }
  12941.          else if (newItem.itemType == "blogPost") {
  12942.              newItem.websiteType = "AlterNet Blog";
  12943.          }
  12944.          
  12945.          
  12946.          // general scraping variables
  12947.          var xpath;
  12948.  
  12949.          
  12950.          // author
  12951.          if (newItem.itemType == "magazineArticle") {
  12952.              xpath = ''//p[@class="storybyline"]//a[contains(@href,"author")]'';
  12953.          }
  12954.          else if (newItem.itemType == "blogPost") {
  12955.              xpath = ''//p[@class="storybyline"]//a[contains(@href,"bloggers")]'';
  12956.          }
  12957.          temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  12958.          if (temp) { 
  12959.              var author = Zotero.Utilities.trimInternal(temp.textContent);
  12960.              if(author.substr(0, 3).toLowerCase() == "by ") {
  12961.                  author = author.substr(3);
  12962.              }
  12963.              
  12964.              var authors = author.split(",");
  12965.              for each (var author in authors) {
  12966.                  newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  12967.              } 
  12968.          }
  12969.          
  12970.          // date
  12971.          if (newItem.itemType == "magazineArticle") {
  12972.              xpath = ''//p[@class="storybyline"]//a[contains(@href,"date")]'';
  12973.              temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  12974.              var date = Zotero.Utilities.strToDate(temp.textContent);     
  12975.          }
  12976.          else if (newItem.itemType == "blogPost") {
  12977.              xpath = ''//p[@class="storybyline"]/b'';
  12978.              temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  12979.              var begin = temp.textContent.lastIndexOf(" on ");
  12980.              temp = temp.textContent.substr(begin + 4);
  12981.              var date = Zotero.Utilities.strToDate(temp.substr(0, temp.length - 1));
  12982.          }
  12983.          if (date != null) {
  12984.              var strdate;
  12985.              
  12986.              date.month = date.month + 1;
  12987.              
  12988.              strdate = date.year + ''-''; 
  12989.              if (date.month < 10) {
  12990.                  strdate += ''0'' + date.month;
  12991.              }
  12992.              else {
  12993.                  strdate += date.month;
  12994.              }
  12995.              if (date.day > 10) {
  12996.                  strdate += ''-'' + date.day;
  12997.              }
  12998.              else { 
  12999.                  strdate += ''-0'' + date.day;
  13000.              }
  13001.            
  13002.              newItem.date = strdate;
  13003.          }
  13004.          
  13005.          // abstract
  13006.          xpath = ''//div[@class="teaser"]//div[contains(@class,"teaser")]'';
  13007.          temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  13008.          if (temp) {
  13009.              newItem.abstractNote = Zotero.Utilities.trimInternal(temp.textContent);
  13010.          }   
  13011.  
  13012.          // article snapshot
  13013.          // grabs 5-digit article code from url and uses it to derive printable page url for use in article snapshot
  13014.          var index = url.toString().indexOf(''.org/'') + 5;
  13015.          index += url.toString().substr(index).indexOf(''/'');
  13016.          if (index != -1) {
  13017.              var printurl;
  13018.              // ordinary article
  13019.              var id = url.toString().substr(index + 1, 5);
  13020.              if (Number(id)) {
  13021.                  printurl = "http://www.alternet.org/module/printversion/" + id;
  13022.                           newItem.attachments.push({url:printurl, title:"AlterNet Article Snapshot", mimeType:"text/html"});
  13023.              }
  13024.              // columnist article
  13025.              else {
  13026.                       index += url.toString().substr(index + 1).indexOf(''/'');
  13027.                       id = url.toString().substr(index + 2, 5);
  13028.                       Zotero.Utilities.cleanString(id);
  13029.                       if  (Number(id)) {
  13030.                      printurl = "http://www.alternet.org/module/printversion/" + id;
  13031.                      if (newItem.itemType == "blogPost") {
  13032.                          printurl += "/?type=blog";
  13033.                      }
  13034.                                    newItem.attachments.push({url:printurl, title:"AlterNet Article Snapshot", mimeType:"text/html"});
  13035.                           }
  13036.              }                          
  13037.          }
  13038.          
  13039.          newItem.complete();
  13040. }
  13041.  
  13042.  
  13043.  
  13044. function doWeb(doc, url) {      
  13045.       // ordinary and columnist articles
  13046.       var xpath = ''//p[@class="storyheadline"]'';
  13047.       var title;
  13048.       if (title = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {  
  13049.           scrape(doc, url, title.textContent);
  13050.       }
  13051.  
  13052.       return null;
  13053. }');
  13054.  
  13055. REPLACE INTO translators VALUES ('56ea09bc-57ee-4f50-976e-cf7cb1f6c6d8', '1.0.0b4.r5', '', '2008-04-23 09:45:00', '0', '100', '4', 'Royal Society Publishing', 'Michael Berkowitz', 'http://journals.royalsociety.org/', 
  13056. 'function detectWeb(doc, url) {
  13057.     if (doc.evaluate(''//div[@class="listItemName"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13058.         return "multiple";
  13059.     } else if (doc.evaluate(''//div[contains(@id, "ExportDiv")]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13060.         return "journalArticle";
  13061.     }
  13062. }', 
  13063. 'function makeURL(str, type) {
  13064.     var m = str.match(/content\/([^/]+)/)[1];
  13065.     if (type == "ris") {
  13066.         return "http://journals.royalsociety.org/export.mpx?code=" + m + "&mode=ris";
  13067.     } else if (type == "pdf") {
  13068.         return "http://journals.royalsociety.org/content/" + m + "/fulltext.pdf";
  13069.     }
  13070. }
  13071.  
  13072. function doWeb(doc, url) {
  13073.     var arts = new Array();
  13074.     if (detectWeb(doc, url) == "multiple") {
  13075.         var items = new Object();
  13076.         var links = doc.evaluate(''//div[@class="listItemName"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  13077.         var link;
  13078.         while (link = links.iterateNext()) {
  13079.             items[link.href] = link.textContent;
  13080.         }
  13081.         items = Zotero.selectItems(items);
  13082.         for (var i in items) {
  13083.             arts.push(i);
  13084.         }
  13085.     } else {
  13086.         arts = [url];
  13087.     }
  13088.     for each (var link in arts) {
  13089.         var newurl = makeURL(link, "ris");
  13090.         var pdfurl = makeURL(link, "pdf");
  13091.         Zotero.Utilities.HTTP.doGet(newurl, function(text) {
  13092.             Zotero.debug(text);
  13093.             var translator = Zotero.loadTranslator("import");
  13094.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  13095.             translator.setString(text);
  13096.             translator.setHandler("itemDone", function(obj, item) {
  13097.                 item.attachments = [
  13098.                     {url:link, title:"Royal Society Snapshot", mimeType:"text/html"},
  13099.                     {url:pdfurl, title:"Royal Society PDF", mimeType:"application/pdf"}
  13100.                 ];
  13101.                 item.complete();
  13102.             });
  13103.             translator.translate();
  13104.         });
  13105.     }
  13106. }');
  13107.  
  13108. REPLACE INTO translators VALUES ('0eeb2ac0-fbaf-4994-b98f-203d273eb9fa', '1.0.0b4.r5', '', '2008-05-05 07:45:00', '1', '100', '4', 'Inter-Research Science Center', 'Michael Berkowitz', 'http://www.int-res.com/', 
  13109. 'function detectWeb(doc, url) {
  13110.     if (doc.evaluate(''//div[@class="journal-index"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
  13111.         doc.evaluate(''//div[@class="tx-indexedsearch-res"]//tr[1]/td[2]//a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13112.         return "multiple";
  13113.     } else if (doc.evaluate(''//a[@class="citeexport"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13114.         return "journalArticle";
  13115.     }
  13116. }', 
  13117. 'var journals = {
  13118.     meps:["Marine Ecology Progress Series", "Mar Ecol Prog Ser"],
  13119.     ab:["Aquatic Biology", "Aquat Biol"],
  13120.     ame:["Aquatic Microbial Ecology", "Aquat Microb Ecol"],
  13121.     dao:["Diseases of Aquatic Organisms", "Dis Aquat Org"],
  13122.     cr:["Climate Research", "Clim Res"],
  13123.     esr:["Endangered Species Research", "Endang Species Res"]
  13124. };
  13125.  
  13126. function doWeb(doc, url) {
  13127.     var arts = new Array();
  13128.     if (detectWeb(doc, url) == "multiple") {
  13129.         var items = new Object();
  13130.         if (doc.evaluate(''//div[@class="tx-indexedsearch-res"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13131.             var titlesx = doc.evaluate(''//div[@class="tx-indexedsearch-res"]//tr[2]/td[2]'', doc, null, XPathResult.ANY_TYPE, null);
  13132.             var linksx = doc.evaluate(''//div[@class="tx-indexedsearch-res"]//tr[1]/td[2]//a'', doc, null, XPathResult.ANY_TYPE, null);
  13133.             var title;
  13134.             var link;
  13135.             while ((title = titlesx.iterateNext()) && (link = linksx.iterateNext())) {
  13136.                 items[link.href] = Zotero.Utilities.trimInternal(title.textContent).match(/doi:\s+[^\s]+\s+(.*)$/)[1];
  13137.             }
  13138.         } else {
  13139.             var stuff = doc.evaluate(''//div[@class="journal-index"]/*[a[contains(text(), "pdf format")]]'', doc, null, XPathResult.ANY_TYPE, null);
  13140.             var thing;
  13141.             var titles = "";
  13142.             while (thing = stuff.iterateNext()) {
  13143.                 titles += thing.textContent;
  13144.             }
  13145.             titles = titles.split(/\n/);
  13146.             Zotero.debug(titles);
  13147.             var names = new Array();
  13148.             for (var i = 0; i < titles.length; i++) {
  13149.                 if (((i-1)%2 == 0) && (titles[i].match(/\w+/))) {
  13150.                     names.push(titles[i]);
  13151.                 }
  13152.             }
  13153.             Zotero.debug(names);
  13154.             var links = doc.evaluate(''//div[@class="journal-index"]/*[a[contains(text(), "pdf format")]]/a[1]'', doc, null, XPathResult.ANY_TYPE, null);
  13155.             var link;
  13156.             while (link = links.iterateNext()) {
  13157.                 items[link.href] = names.shift();
  13158.             }
  13159.         }
  13160.         
  13161.         items = Zotero.selectItems(items);
  13162.         for (var i in items) {
  13163.             arts.push(i);
  13164.         }
  13165.     } else {
  13166.         arts = [url];
  13167.     }
  13168.     Zotero.Utilities.processDocuments(arts, function(doc) {
  13169.         var item = new Zotero.Item("journalArticle");
  13170.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@class="bb"]/h2'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13171.         item.url = doc.location.href;
  13172.         var voliss = item.url.match(/v(\d+)\/(n(\d+)\/)?p([^/]+)\//);
  13173.         item.volume = voliss[1];
  13174.         item.pages = voliss[4];
  13175.         if (voliss[2]) item.issue = voliss[3];
  13176.         var jour = item.url.match(/abstracts\/([^/]+)\//)[1];
  13177.         item.publicationTitle = journals[jour][0];
  13178.         item.journalAbbreviation = journals[jour][1];
  13179.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@class="abstract_block"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13180.         var authors = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@class="bb"]/h3'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(/,\s+/);
  13181.         for each (var aut in authors) {
  13182.             aut = aut.replace(/[^\w^\s^\.]/g, "").replace(/\d/g, "");
  13183.             item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  13184.         }
  13185.         item.date = doc.evaluate(''//div[@class="abs-footer"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/date:\s+(.*)P/)[1];
  13186.         item.DOI = Zotero.Utilities.trimInternal(doc.evaluate(''//h1[@class="csc-firstHeader"]/span'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).match(/doi:\s+(.*)/)[1];
  13187.         var tags = doc.evaluate(''//div[@class="box"]/p/a'', doc, null, XPathResult.ANY_TYPE, null);
  13188.         var tag;
  13189.         while (tag = tags.iterateNext()) {
  13190.             item.tags.push(tag.textContent);
  13191.         }        
  13192.         var pdfurl = doc.evaluate(''//a[contains(@href, ".pdf")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  13193.         item.attachments = [
  13194.             {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"},
  13195.             {url:pdfurl, title:item.publicationTitle + " Full Text PDF", mimeType:"application/pdf"}
  13196.         ];
  13197.         item.complete();
  13198.     }, function() {Zotero.done;});
  13199.     Zotero.wait();
  13200. }');
  13201.  
  13202. REPLACE INTO translators VALUES ('70295509-4c29-460f-81a3-16d4ddbb93f6', '1.0.0b4.r5', '', '2008-04-23 09:45:00', '0', '100', '4', 'GSA Journals Online', 'Michael Berkowitz', 'http://www.gsajournals.org/', 
  13203. 'function detectWeb(doc, url) {
  13204.     if (url.indexOf("request=search") != -1 || url.indexOf("request=get-toc") != -1) {
  13205.         return "multiple";
  13206.     } else if (url.indexOf("request=get-abstract") != -1 || url.indexOf("request=get-document") != -1) {
  13207.         return "journalArticle";
  13208.     }
  13209. }', 
  13210. 'function doWeb(doc, url) {
  13211.     var arts = new Array();
  13212.     if (detectWeb(doc, url) == "multiple") {
  13213.         var items = new Object();
  13214.         var results = doc.evaluate(''//*[@class="group"]'', doc, null, XPathResult.ANY_TYPE, null);
  13215.         var next;
  13216.         while (next = results.iterateNext()) {
  13217.             var title = Zotero.Utilities.trimInternal(doc.evaluate(''.//*[@class="title"]'', next, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13218.             var link = doc.evaluate(''.//a[1]'', next, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  13219.             items[link] = title;
  13220.         }
  13221.         items = Zotero.selectItems(items);
  13222.         for (var i in items) {
  13223.             arts.push(i.replace(/get\-(abstract|document)/, "cite-builder"));
  13224.         }
  13225.     } else {
  13226.         arts = [url.replace(/get\-(abstract|document)/, "cite-builder")];
  13227.     }
  13228.     Zotero.Utilities.processDocuments(arts, function(doc) {
  13229.         var newurl = doc.evaluate(''//a[contains(@href, "refman")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  13230.         var oldurl = doc.location.href;
  13231.         Zotero.Utilities.HTTP.doGet(newurl, function(text) {
  13232.             var translator = Zotero.loadTranslator("import");
  13233.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  13234.             translator.setString(text);
  13235.             translator.setHandler("itemDone", function(obj, item) {
  13236.                 item.url = oldurl;
  13237.                 item.DOI = decodeURIComponent(item.url.match(/doi=([^&]+)/)[1]);
  13238.                 var pdfurl = ''http://www.gsajournals.org/perlserv/?request=res-loc&uri=urn:ap:pdf:doi:'' + item.DOI;
  13239.                 item.attachments = [
  13240.                     {url:item.url, title:"GSA Snapshot", mimeType:"text/html"},
  13241.                     {url:pdfurl, title:"GSA Full Text PDF", mimeType:"application/pdf"}
  13242.                 ];
  13243.                 item.complete();
  13244.             });
  13245.             translator.translate();
  13246.         });
  13247.     }, function() {Zotero.done;});
  13248. }');
  13249.  
  13250. REPLACE INTO translators VALUES ('9d822257-2eec-4674-b6d0-2504f54c8890', '1.0.0b4.r5', '', '2008-04-18 08:55:00', '0', '100', '4', 'African Journals Online', 'Michael Berkowitz', 'http://www.ajol.info', 
  13251. 'function detectWeb(doc, url) {
  13252.     if (url.match(/viewarticle.php/)) {
  13253.         return "journalArticle";
  13254.     } else if (url.match(/search.php/) || url.match(/viewissue.php/)) {
  13255.         return "multiple";
  13256.     }
  13257. }', 
  13258. 'function getID(str) {
  13259.     return str.match(/(&|\?)id=(\d+)&?/)[2];
  13260. }
  13261.  
  13262. function doWeb(doc, url) {
  13263.     var articles = new Array();
  13264.     if (detectWeb(doc, url) == "multiple") {
  13265.         if (url.match(/search.php/)) {
  13266.             var items = Zotero.Utilities.getItemArray(doc, doc, "viewarticle.php?");
  13267.         } else if (url.match("viewissue.php")) {
  13268.             var items = new Object();
  13269.             var titles = doc.evaluate(''//span[@class="toctitle"]'', doc, null, XPathResult.ANY_TYPE, null);
  13270.             var links = doc.evaluate(''//a[text() = "Abstract"]'', doc, null, XPathResult.ANY_TYPE, null);
  13271.             var title;
  13272.             var link;
  13273.             while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  13274.                 items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  13275.             }
  13276.         }
  13277.         items = Zotero.selectItems(items);
  13278.         for (var i in items) {
  13279.             articles.push(getID(i));
  13280.         }
  13281.     } else {
  13282.         articles = [getID(url)];
  13283.     }
  13284.     Zotero.debug(articles);
  13285.     for each (var id in articles) {
  13286.         var getstr = ''http://www.ajol.info/rst/rst.php?op=capture_cite&id='' + id + ''&cite=refman'';
  13287.         Zotero.Utilities.HTTP.doGet(getstr, function(text) {
  13288.             // load translator for RIS
  13289.             var translator = Zotero.loadTranslator("import");
  13290.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  13291.             translator.setString(text);
  13292.             translator.setHandler("itemDone", function(obj, item) {
  13293.                 var pubinfo = item.publicationTitle.match(/(.*);([^;]+)$/);
  13294.                 item.publicationTitle = pubinfo[1];
  13295.                 var voliss = pubinfo[2].toLowerCase();
  13296.                 if (voliss.match(/v/)) item.volume = voliss.match(/v(ol\.)?\s+(\d+)/)[2];
  13297.                 if (voliss.match(/n/)) item.issue = voliss.match(/n(o\.)?\s+(\d+)/)[2];
  13298.                 if (voliss.match(/p(age)?/)) item.pages = voliss.match(/\d+\-\d+/)[0];
  13299.                 item.date = voliss.match(/\(([^)]+)\)/)[1];
  13300.                 item.attachments[0].title = "African Journals Online Snapshot";
  13301.                 item.attachments[0].mimeType = "text/html";
  13302.                 item.complete();
  13303.             });
  13304.             translator.translate();
  13305.         });
  13306.     }
  13307. }');
  13308.  
  13309. REPLACE INTO translators VALUES ('dedcae51-073c-48fb-85ce-2425e97f128d', '1.0.0b4.r5', '', '2008-04-18 08:55:00', '0', '100', '4', 'Archive Ouverte en Sciences de l''Information et de la Communication  (AOSIC)', 'Michael Berkowitz', 'http://archivesic.ccsd.cnrs.fr/', 
  13310. 'function detectWeb(doc, url) {
  13311.     if (doc.title.toLowerCase().match("fulltext search")) {
  13312.         return "multiple";
  13313.     } else if (url.match(/sic_\d+/)) {
  13314.         return "journalArticle";
  13315.     }
  13316. }', 
  13317. 'var metaTags = {
  13318.     "DC.relation":"url",
  13319.     "DC.date":"date",
  13320.     "DC.description":"abstractNote",
  13321.     "DC.creator":"creators",
  13322.     "DC.title":"title"
  13323. }
  13324.  
  13325. function doWeb(doc, url) {
  13326.     var articles = new Array();
  13327.     if (detectWeb(doc, url) == "multiple") {
  13328.         var items = Zotero.Utilities.getItemArray(doc, doc, /sic_\d+\/fr\//);
  13329.         items = Zotero.selectItems(items) 
  13330.         for (var i in items) {
  13331.             articles.push(i);
  13332.         }
  13333.     } else {
  13334.         articles = [url];
  13335.     }
  13336.     Zotero.Utilities.processDocuments(articles, function(doc) {
  13337.         var xpath = ''//meta[@name]'';
  13338.         var data = new Object();
  13339.         var metas = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  13340.         var meta;
  13341.         while (meta = metas.iterateNext()) {
  13342.             if (data[meta.name]) {
  13343.                 data[meta.name] = data[meta.name] + ";" + meta.content;
  13344.             } else {
  13345.                 data[meta.name] = meta.content;
  13346.             }
  13347.         }
  13348.         Zotero.debug(data);
  13349.         var item = new Zotero.Item("journalArticle");
  13350.         for (var tag in metaTags) {
  13351.             if (tag == "DC.creator") {
  13352.                 var authors = data[''DC.creator''].split(";");
  13353.                 for each (var aut in authors) {
  13354.                     aut = aut.replace(/^([^,]+),\s+(.*)$/, "$2 $1");
  13355.                     item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  13356.                 }
  13357.             } else {
  13358.                 item[metaTags[tag]] = data[tag];
  13359.             }
  13360.         }
  13361.         var pdfurl = doc.evaluate(''//a[contains(@href, ".pdf")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/url=([^&]+)&/)[1];
  13362.         Zotero.debug(pdfurl);
  13363.         item.attachments = [
  13364.             {url:item.url, title:"AOSIC Snapshot", mimeType:"text/html"},
  13365.             {url:pdfurl, title:"AOSIC Full Text PDF", mimeType:"application/pdf"}
  13366.         ];
  13367.         item.complete();
  13368.     }, function() {Zotero.done;});
  13369.     Zotero.wait();
  13370. }');
  13371.  
  13372. REPLACE INTO translators VALUES ('4afb932d-9211-4c0b-a31c-cfa984d62b66', '1.0.0b4.r5', '', '2008-05-20 19:10:00', '1', '100', '4', 'OAIster', 'Michael Berkowitz', 'http://quod.lib.umich.edu/cgi/b/', 
  13373. 'function detectWeb(doc, url) {
  13374.     if (doc.title.indexOf("OAIster") != -1) {
  13375.         return "multiple";
  13376.     }
  13377. }', 
  13378. 'function doWeb(doc, url) {
  13379.     var items = new Array();
  13380.     var titlex = ''/html/body/table/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[1]/td[4]/font'';
  13381.     var titles = doc.evaluate(titlex, doc, null, XPathResult.ANY_TYPE, null);
  13382.     var title;
  13383.     while (title = titles.iterateNext()) {
  13384.         items.push(Zotero.Utilities.trimInternal(title.textContent));
  13385.     }
  13386.     items = Zotero.selectItems(items);
  13387.     titles = new Array();
  13388.     for each (var title in items) {
  13389.         titles.push(title);
  13390.     }
  13391.     Zotero.debug(titles);
  13392.     var xpath = ''//table/tbody/tr/td/table/tbody//table/tbody[tr/td[4]]'';
  13393.     var arts = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  13394.     var art;
  13395.     while (art = arts.iterateNext()) {
  13396.         var data = new Object();
  13397.         var rows = doc.evaluate(''./tr[td[4]]'', art, null, XPathResult.ANY_TYPE, null);
  13398.         var row;
  13399.         while (row = rows.iterateNext()) {
  13400.             var tag = Zotero.Utilities.trimInternal(doc.evaluate(''./td[2]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13401.             var value = Zotero.Utilities.trimInternal(doc.evaluate(''./td[4]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13402.             if (tag == "Note") {
  13403.                 if (!data[''Note'']) {
  13404.                     data[tag] = Zotero.Utilities.unescapeHTML(value);
  13405.                 }
  13406.             } else {
  13407.                 data[tag] = Zotero.Utilities.unescapeHTML(value);
  13408.             }
  13409.             
  13410.         }
  13411.         var item = new Zotero.Item();
  13412.         if (data[''Resource Type'']) {
  13413.             var itemType = data[''Resource Type''];
  13414.         } else {
  13415.             var itemType = "journalArticle";
  13416.         }
  13417.         if (itemType == "journalArticle" || itemType.match(/(A|a)rticle/) || itemType.match(/text/)) {
  13418.             item.itemType = "journalArticle";
  13419.         } else if (itemType.match(/(T|t)hesis/)) {
  13420.             item.itemType = "thesis";
  13421.         } else if (itemType == "image") {
  13422.             item.itemType = "artwork";
  13423.         }
  13424.         item.title = data[''Title''];
  13425.         if (data[''Author/Creator'']) {
  13426.             var authors = data[''Author/Creator''].split(/;/);
  13427.             for each (var aut in authors) {
  13428.                 if (aut.match(/,/)) {
  13429.                     aut = aut.split(/,\s+/);
  13430.                     aut = aut[1] + " " + aut[0];
  13431.                 }
  13432.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  13433.             }
  13434.         }
  13435.         item.date = data[''Year'']; //.match(/\d{4}\-\d{2}\-\d{2}/)[0];
  13436.         item.url = data[''URL''];
  13437.         if (data[''Note'']) item.abstractNote = Zotero.Utilities.trimInternal(data[''Note'']);
  13438.         if (data[''Subject'']) {
  13439.             var keys = data[''Subject''].split(/;/);
  13440.             for each (var kw in keys) {
  13441.                 if (kw.match(/\w+/)) item.tags.push(kw);
  13442.             }
  13443.         }
  13444.         for (var i in titles) {
  13445.             if (item.title == titles[i]) item.complete();
  13446.         }
  13447.     }
  13448. }');
  13449.  
  13450. REPLACE INTO translators VALUES ('675306d2-fca9-466f-b33d-1e3cc1bfd091', '1.0.0b4.r5', '', '2008-04-18 08:55:00', '0', '100', '4', 'Universiteit van Amsterdam', 'Michael Berkowitz', 'http://opc.uva.nl:8080/', 
  13451. 'function detectWeb(doc, url) {
  13452.     if (doc.evaluate(''//td[3][@class="hit"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13453.         return "multiple";
  13454.     } else if (doc.title.match("results/titledata")) {
  13455.         return "book";
  13456.     }
  13457. }', 
  13458. 'function scrape(item, langTags, data) {
  13459.     for (var tag in data) {
  13460.         tag = tag.toLowerCase();
  13461.         if (langTags[tag] == "creators") {
  13462.             var authors = data[tag].split(",");
  13463.             for each (var aut in authors) {
  13464.                 item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aut), "author"));
  13465.             }
  13466.         } else if (langTags[tag] == "tags") {
  13467.             var kws = data[tag].split(/(,|;)/);
  13468.             for each (var key in kws) {
  13469.                 if (key.match(/\w+/)) item.tags.push(Zotero.Utilities.trimInternal(key));
  13470.             }
  13471.         } else if (langTags[tag] == "publisher") {
  13472.             var pub = data[tag].split(/\s*:\s*/);
  13473.             item.place = pub[0];
  13474.             item.publisher = pub[1];
  13475.         } else {
  13476.             item[langTags[tag]] = data[tag];
  13477.         }
  13478.     }
  13479. }
  13480.  
  13481. var tagsEN = {
  13482.     "title":"title",
  13483.     "author(s)":"creators",
  13484.     "publisher":"publisher",
  13485.     "year":"date",
  13486.     "isbn":"ISBN",
  13487.     "subject headings":"tags",
  13488.     "subject heading person":"tags",
  13489.     "call number":"callNumber"
  13490. }
  13491.  
  13492. var tagsNE = {
  13493.     "titel":"title",
  13494.     "auteur(s)":"creators",
  13495.     "uitgever":"publisher",
  13496.     "jaar":"date",
  13497.     "isbn":"ISBN",
  13498.     "trefwoorden":"tags",
  13499.     "trefwoord persoon":"tags",
  13500.     "plaatsnummer":"callNumber"
  13501. }
  13502.  
  13503. function doWeb(doc, url) {
  13504.     var books = new Array();
  13505.     if (detectWeb(doc, url) == "multiple") {
  13506.         var items = new Object();
  13507.         var links = doc.evaluate(''//td[3][@class="hit"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  13508.         var link;
  13509.         while (link = links.iterateNext()) {
  13510.             items[link.href] = Zotero.Utilities.trimInternal(link.textContent);
  13511.         }
  13512.         items = Zotero.selectItems(items);
  13513.         for (var i in items) {
  13514.             books.push(i);
  13515.         }
  13516.     } else {
  13517.         books = [url];
  13518.     }
  13519.     Zotero.Utilities.processDocuments(books, function(newDoc) {
  13520.         var data = new Object();
  13521.         var box = newDoc.evaluate(''//table/tbody/tr[1]/td[2]/table/tbody/tr'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext();
  13522.         var tags = newDoc.evaluate(''//table/tbody/tr[1]/td[2]/table/tbody/tr/td[1]'', newDoc, null, XPathResult.ANY_TYPE, null);
  13523.         var values = newDoc.evaluate(''//table/tbody/tr[1]/td[2]/table/tbody/tr/td[2]'', newDoc, null, XPathResult.ANY_TYPE, null);
  13524.         var tag;
  13525.         var value;
  13526.         while ((tag = tags.iterateNext()) && (value = values.iterateNext())) {
  13527.             tag = Zotero.Utilities.trimInternal(tag.textContent).replace(/:/, "").toLowerCase();
  13528.             if (tagsEN[tag] || tagsNE[tag]) {
  13529.                 data[tag] = Zotero.Utilities.trimInternal(value.textContent);
  13530.             }
  13531.         }
  13532.         item = new Zotero.Item("book");
  13533.         var lingTags = new Array();
  13534.         if (data[''titel'']) {
  13535.             lingTags = tagsNE;
  13536.         } if (data[''title'']) {
  13537.             lingTags = tagsEN;
  13538.         }
  13539.         scrape(item, lingTags, data);
  13540.         item.complete();
  13541.     }, function() {Zotero.done;});
  13542. }');
  13543.  
  13544. REPLACE INTO translators VALUES ('bbad0221-134b-495a-aa56-d77cfaa67ab5', '1.0.0b4.r5', '', '2008-04-16 04:45:00', '0', '100', '4', 'Digital Humanities Quarterly', 'Michael Berkowitz', 'http://www.digitalhumanities.org/(dhq)?', 
  13545. 'function detectWeb(doc, url) {
  13546.     if (doc.evaluate(''//div[@class="DHQarticle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13547.         return "journalArticle";
  13548.     } else if (doc.evaluate(''//div[@id="mainContent"]/div/p'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13549.         return "multiple";
  13550.     }
  13551. }', 
  13552. 'function scrape(doc, xpath, xdoc) {
  13553.     return Zotero.Utilities.trimInternal(doc.evaluate(xpath, xdoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13554. }
  13555.  
  13556. function doWeb(doc, url) {
  13557.     var articles = new Array();
  13558.     if (detectWeb(doc, url) == "multiple") {
  13559.         var items = new Object;
  13560.         var arts = doc.evaluate(''//div[@id="mainContent"]/div/p/a'', doc, null, XPathResult.ANY_TYPE, null);
  13561.         var art;
  13562.         while (art = arts.iterateNext()) {
  13563.             items[art.href] = art.textContent;
  13564.         }
  13565.         items = Zotero.selectItems(items);
  13566.         for (var i in items) {
  13567.             articles.push(i)
  13568.         }
  13569.     } else {
  13570.         articles = [url];
  13571.     }
  13572.     Zotero.debug(articles);
  13573.  
  13574.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  13575.         var item = new Zotero.Item("journalArticle");
  13576.         item.url = newDoc.location.href;
  13577.         item.title = scrape(newDoc, ''//h1[@class="articleTitle"]'', newDoc);
  13578.         var voliss = scrape(newDoc, ''//div[@id="pubInfo"]'', newDoc);
  13579.         voliss = voliss.match(/(.*)Volume\s+(\d+)\s+Number\s+(\d+)/);
  13580.         item.date = voliss[1];
  13581.         item.volume = voliss[2];
  13582.         item.issue = voliss[3];        
  13583.         var authors = newDoc.evaluate(''//div[@class="author"]'', newDoc, null, XPathResult.ANY_TYPE, null);
  13584.         var aut;
  13585.         while (aut = authors.iterateNext()) {
  13586.             item.creators.push(Zotero.Utilities.cleanAuthor(scrape(newDoc, ''./a[1]'', aut), "author"));
  13587.         }
  13588.         item.attachments = [{url:item.url, title:"DHQ Snapshot", mimeType:"text/html"}];
  13589.         item.complete();
  13590.     }, function() {Zotero.done;});
  13591. }');
  13592.  
  13593. REPLACE INTO translators VALUES ('fb342bae-7727-483b-a871-c64c663c2fae', '1.0.0b4.r5', '', '2008-04-11 08:30:00', '0', '100', '4', 'BusinessWeek', 'Michael Berkowitz', 'http://(www\.)?businessweek.com', 
  13594. 'function detectWeb(doc, url) {
  13595.     if (doc.title == "BusinessWeek Search Results") {
  13596.         return "multiple";
  13597.     } else if (doc.evaluate(''//meta[@name="headline"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13598.         return "magazineArticle";
  13599.     }
  13600. }', 
  13601. 'function doWeb(doc, url) {
  13602.     var articles = new Array();
  13603.     if (detectWeb(doc, url) == "multiple") {
  13604.         var results = doc.evaluate(''//div[@class="result"]/h3[@class="story"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  13605.         var result;
  13606.         var items = new Object();
  13607.         while (result = results.iterateNext()) {
  13608.             items[result.href] = Zotero.Utilities.trimInternal(result.textContent);
  13609.         }
  13610.         items = Zotero.selectItems(items);
  13611.         for (var i in items) {
  13612.             articles.push(i);
  13613.         }
  13614.     } else {
  13615.         articles = [url];
  13616.     }
  13617.     Zotero.debug(articles);
  13618.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  13619.         var metaTags = new Object();
  13620.         var metas = newDoc.evaluate(''//meta'', newDoc, null, XPathResult.ANY_TYPE, null);
  13621.         var meta;
  13622.         while (meta = metas.iterateNext()) {
  13623.             metaTags[meta.name] = meta.content;
  13624.         }
  13625.         Zotero.debug(metaTags);
  13626.         var item = new Zotero.Item("magazineArticle");
  13627.         item.title = metaTags[''headline''];
  13628.         item.abstractNote = metaTags[''abstract''];
  13629.         item.tags = metaTags[''keywords''].split(/\s*,\s*/);
  13630.         item.creators.push(Zotero.Utilities.cleanAuthor(metaTags[''author''], "author"));
  13631.         item.publicationTitle = "BusinessWeek: " + metaTags[''channel''];
  13632.         item.url = newDoc.location.href;
  13633.         item.date = metaTags[''pub_date''].replace(/(\d{4})(\d{2})(\d{2})/, "$2/$3/$1");
  13634.         item.complete();
  13635.     }, function() {Zotero.done;});
  13636.     Zotero.wait();
  13637. }');
  13638.  
  13639. REPLACE INTO translators VALUES ('409c520b-0720-4011-8fce-70fcd9806493', '1.0.0b4.r5', '', '2008-04-09 00:45:00', '0', '100', '4', 'InderScience', 'Michael Berkowitz', 'http://www.inderscience.com/', 
  13640. 'function detectWeb(doc, url) {
  13641.     if (doc.evaluate(''/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]][2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() 
  13642.         || doc.evaluate(''//td[1][@class="textcontent"]/table/tbody/tr/td[2]/b/u/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13643.         return "multiple";
  13644.     } else if (url.indexOf("rec_id") != -1) {
  13645.         return "journalArticle";
  13646.     }
  13647. }', 
  13648. 'function doWeb(doc, url) {
  13649.     if (detectWeb(doc, url) == "journalArticle") {
  13650.         scrape(url);
  13651.     } else if ((detectWeb(doc, url) == "multiple")) {
  13652.         if (doc.evaluate(''/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13653.             var items = new Object();
  13654.             var results = doc.evaluate(''/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]]'', doc, null, XPathResult.ANY_TYPE, null);
  13655.             var result;
  13656.             while (result = results.iterateNext()) {
  13657.                 var title = Zotero.Utilities.trimInternal(doc.evaluate(''.//tr[1]/td[3]'', result, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13658.                 var id = doc.evaluate(''.//tr[8]/td[2]/a[2]'', result, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/rec_id=([^&]+)/)[1];
  13659.                 items[id] = title;
  13660.             }
  13661.             items = Zotero.selectItems(items);
  13662.             for (var i in items) {
  13663.                 scrape(''http://www.inderscience.com/search/index.php?action=record&rec_id='' + i);
  13664.             }
  13665.         } else {
  13666.             var arts = new Array();
  13667.             var items = Zotero.Utilities.getItemArray(doc, doc, "&rec_id");
  13668.             items = Zotero.selectItems(items);
  13669.             for (var i in items) {
  13670.                 scrape(i);
  13671.             }
  13672.         }
  13673.     }
  13674.     Zotero.wait();
  13675. }
  13676.  
  13677. function scrape(link) {
  13678.     Zotero.Utilities.loadDocument(link, function(newDoc) {
  13679.         var data = new Object();
  13680.         var rows = newDoc.evaluate(''/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]]//tr[td[3]]'', newDoc, null, XPathResult.ANY_TYPE, null);
  13681.         var row;
  13682.         while (row = rows.iterateNext()) {
  13683.             var tag = Zotero.Utilities.trimInternal(newDoc.evaluate(''./td[2]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13684.             var value = Zotero.Utilities.trimInternal(newDoc.evaluate(''./td[3]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  13685.             data[tag] = value;
  13686.         }
  13687.         Zotero.debug(data);
  13688.         var item = new Zotero.Item("journalArticle");
  13689.         item.title = data[''Title:''];
  13690.         item.abstractNote = data[''Abstract:''];
  13691.         item.url = newDoc.location.href;
  13692.         item.tags = data[''Keywords:''].substr(0, data[''Keywords:''].length - 1).split(/\s*;\s*/);
  13693.         item.DOI = data[''DOI:''];
  13694.         item.attachments.push({url:item.url, title:item.title + ": InderScience Snapshot", mimeType:"text/html"});
  13695.         var authors = data[''Author:''].split(/\s*,\s*/);
  13696.         for each (var author in authors) {
  13697.             item.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  13698.         }
  13699.         var voliss = data[''Journal:''].match(/^([^\d]+)(\d+)\s*\-\s*Vol\.\s*(\d+)\s*,\s*No\.(.+)pp\.\s*(.*)$/);
  13700.         Zotero.debug(voliss);
  13701.         item.publicationTitle = voliss[1];
  13702.         item.date = voliss[2];
  13703.         item.volume = voliss[3];
  13704.         item.issue = voliss[4];
  13705.         item.pages = voliss[5];
  13706.         item.complete();
  13707.       }, function() {Zotero.done;});
  13708. }');
  13709.  
  13710. REPLACE INTO translators VALUES ('8381bf68-11fa-418c-8530-2e00284d3efd', '1.0.0b4.r5', '', '2008-04-09 00:45:00', '0', '100', '4', 'IRIS translator', 'Chad Mills and Michael Berkowitz', 'http://[^/]*www.iris.rutgers.edu[^/]*/', 
  13711. 'function detectWeb(doc, url) {
  13712.     if (doc.evaluate(''//tr/td[1][@class="searchsum"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13713.         return "multiple";
  13714.     } else if (doc.evaluate(''//th[@class="viewmarctags"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  13715.         return "book";
  13716.     }
  13717. }', 
  13718. 'function scrape(doc) {
  13719.   var namespace = doc.documentElement.namespaceURI;
  13720.   var nsResolver = namespace ? function(prefix) {
  13721.     if (prefix == ''x'') return namespace; else return null;
  13722.   } : null;
  13723.  
  13724.   var xpath = ''//div[@id="panel1"]//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'';
  13725.   var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  13726.   var elmt = elmts.iterateNext();
  13727.  
  13728.   if(!elmt) {
  13729.     return false;
  13730.   }
  13731.  
  13732.   var newItem = new Zotero.Item("book");
  13733.   newItem.extra = "";
  13734.  
  13735.   newItem.series = "";
  13736.   var seriesItemCount = 0;
  13737.  
  13738.   while(elmt) {
  13739.     try {
  13740.       var node = doc.evaluate(''./TD[1]/A[1]/strong[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13741.       if(!node) {
  13742.     var node = doc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13743.       }
  13744.       if(node) {
  13745.     var casedField = Zotero.Utilities.superCleanString(doc.evaluate(''./TH[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  13746.     field = casedField.toLowerCase();
  13747.     var value = Zotero.Utilities.superCleanString(node.nodeValue);
  13748.     if(field == "publisher") {
  13749.       newItem.publisher = value;
  13750.     } else if(field == "pub date") {
  13751.       var re = /[0-9]+/;
  13752.       var m = re.exec(value);
  13753.       newItem.date = m[0];
  13754.     } else if(field == "isbn") {
  13755.       var re = /^[0-9](?:[0-9X]+)/;
  13756.       var m = re.exec(value);
  13757.       newItem.ISBN = m[0];
  13758.     } else if(field == "title") {
  13759.       var titleParts = value.split(" / ");
  13760.       re = /\[(.+)\]/i;
  13761.       if (re.test(titleParts[0])) {
  13762.         var ar = re.exec(titleParts[0]);
  13763.         var itype = ar[1].toLowerCase();
  13764.         if(itype== "phonodisc" || itype == "sound recording"){
  13765.           newItem.itemType = "audioRecording";
  13766.         }else if(itype=="videorecording"){
  13767.           newItem.itemType = "videoRecording";
  13768.         }else if(itype=="electronic resource"){
  13769.           newItem.itemType = "webPage";
  13770.         }
  13771.       }
  13772.       newItem.title = Zotero.Utilities.capitalizeTitle(titleParts[0]);
  13773.     }else if(field == "series") {//push onto item, delimit with semicolon when needed
  13774.       if (seriesItemCount != 0){
  13775.         newItem.series +=  "; " + value;
  13776.       }
  13777.       else if(seriesItemCount == 0) {
  13778.         newItem.series =  value;
  13779.       }
  13780.       seriesItemCount++;//bump counter
  13781.     }else if(field == "dissertation note") {
  13782.       newItem.itemType = "thesis";
  13783.       var thesisParts = value.split("--");
  13784.       var uniDate = thesisParts[1].split(", ");
  13785.       newItem.university = uniDate[0];
  13786.       newItem.date = uniDate[1];
  13787.     }else if(field == "edition") {
  13788.       newItem.edition = value;
  13789.     }else if(field == "physical descrip") {
  13790.       //support
  13791.       var physParts = value.split(" : ");
  13792.       var physParts = physParts[0].split(" ; ");
  13793.       newItem.pages = physParts[0];
  13794.     } else if(field == "publication info") {
  13795.       var pubParts = value.split(" : ");
  13796.       newItem.place = pubParts[0];
  13797.       newItem.publisher = pubParts[1];
  13798.     } else if(field == "personal author") {
  13799.       newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
  13800.     } else if(field == "performer") {
  13801.       newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "performer", true));
  13802.     } else if(field == "author"){
  13803.       newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
  13804.     } else if(field == "added author") {
  13805.       newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "contributor", true));
  13806.     } else if(field == "conference author" || field == "corporate author") {
  13807.       newItem.creators.push(value);
  13808.     } else if(field == "subject" || field == "corporate subject" || field == "geographic term") {
  13809.       var subjects = value.split("--");
  13810.       newItem.tags = newItem.tags.concat(subjects);
  13811.     } else if(field == "personal subject") {
  13812.       var subjects = value.split(", ");
  13813.       newItem.tags = newItem.tags.push(value[0]+", "+value[1]);
  13814.     } else if(value && field != "http") {
  13815.       newItem.extra += casedField+": "+value+"\n";
  13816.     }
  13817.       }
  13818.     } catch (e) {}
  13819.     elmt = elmts.iterateNext();
  13820.   }
  13821.  
  13822.   if(newItem.extra) {
  13823.     newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
  13824.   }
  13825.  
  13826.   var callNumber = doc.evaluate(''//tr/td[1][@class="holdingslist"]/strong/text()'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13827.   if(callNumber && callNumber.nodeValue) {
  13828.     newItem.callNumber = callNumber.nodeValue;
  13829.   }
  13830.  
  13831.   var domain = doc.location.href.match(/https?:\/\/([^/]+)/);
  13832.   newItem.repository = domain[1]+" Library Catalog";
  13833.   newItem.accessed = Date();
  13834.   newItem.complete();
  13835.   return true;
  13836. }
  13837.  
  13838. function doWeb(doc, url){
  13839.   var namespace = doc.documentElement.namespaceURI;
  13840.   var nsResolver = namespace ? function(prefix) {
  13841.     if (prefix == ''x'') return namespace; else return null;
  13842.   } : null;
  13843.  
  13844.   var sirsiNew = true; //toggle between SIRSI -2003 and SIRSI 2003+
  13845.   var xpath = ''//td[@class="searchsum"]/table'';
  13846.  
  13847.   if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13848.     Zotero.debug("SIRSI doWeb: searchsum");
  13849.     sirsiNew = true;
  13850.   } else if (doc.evaluate(''//form[@name="hitlist"]/table/tbody/tr'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13851.     Zotero.debug("SIRSI doWeb: hitlist");
  13852.     sirsiNew = false;
  13853.   } else if (doc.evaluate(''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13854.     Zotero.debug("SIRSI doWeb: viewmarctags");
  13855.     sirsiNew = true;
  13856.   } else if (doc.evaluate(''//input[@name="VOPTIONS"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13857.     Zotero.debug("SIRSI doWeb: VOPTIONS");
  13858.     sirsiNew = false;
  13859.   } else {
  13860.     var elmts = doc.evaluate(''/html/body/form//text()'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13861.     while(elmt = elmts.iterateNext()) {
  13862.       if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
  13863.     Zotero.debug("SIRSI doWeb: Viewing record");
  13864.     sirsiNew = false;
  13865.       }
  13866.     }
  13867.   }
  13868.  
  13869.   if (sirsiNew) { //executes Simon''s SIRSI 2003+ scraper code
  13870.     Zotero.debug("Running SIRSI 2003+ code");
  13871.     if(!scrape(doc)) {
  13872.       var checkboxes = new Array();
  13873.       var urls = new Array();
  13874.       var availableItems = new Array();
  13875.       //begin IUCAT fixes by Andrew Smith
  13876.       var iuRe = /^https?:\/\/www\.iucat\.iu\.edu/;
  13877.       var iu = iuRe.exec(url);
  13878.       //IUCAT fix 1 of 2
  13879.       if (iu){
  13880.     var tableRows = doc.evaluate(''//td[@class="searchsum"]/table[//input[@class="submitLink"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13881.       } else{
  13882.     var tableRows = doc.evaluate(''//td[@class="searchsum"]/table[//input[@value="Details"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13883.       }
  13884.       var tableRow = tableRows.iterateNext();        // skip first row
  13885.       // Go through table rows
  13886.       while(tableRow = tableRows.iterateNext()) {
  13887.     //IUCAT fix 2 of 2
  13888.     if (iu){
  13889.       var input = doc.evaluate(''.//input[@class="submitLink"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13890.       var text = doc.evaluate(''.//label/span'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13891.     } else {
  13892.       var input = doc.evaluate(''.//input[@value="Details"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13893.       var text = doc.evaluate(''.//label/strong'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13894.     }
  13895.     //end IUCAT fixes by Andrew Smith
  13896.     if(text) {
  13897.       availableItems[input.name] = text;
  13898.     }
  13899.       }
  13900.       var items = Zotero.selectItems(availableItems);
  13901.       if(!items) {
  13902.     return true;
  13903.       }
  13904.       var hostRe = new RegExp("^http(?:s)?://[^/]+");
  13905.       var m = hostRe.exec(doc.location.href);
  13906.       Zotero.debug("href: " + doc.location.href);
  13907.       var hitlist = doc.forms.namedItem("hitlist");
  13908.       var baseUrl = m[0]+hitlist.getAttribute("action")+"?first_hit="+hitlist.elements.namedItem("first_hit").value+"&last_hit="+hitlist.elements.namedItem("last_hit").value;
  13909.       var uris = new Array();
  13910.       for(var i in items) {
  13911.     uris.push(baseUrl+"&"+i+"=Details");
  13912.       }
  13913.       Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  13914.                     function() { Zotero.done() }, null);
  13915.       Zotero.wait();
  13916.     }
  13917.   } else{  //executes Simon''s SIRSI -2003 translator code
  13918.     Zotero.debug("Running SIRSI -2003 code");
  13919.     var uri = doc.location.href;
  13920.     var recNumbers = new Array();
  13921.     var xpath = ''//form[@name="hitlist"]/table/tbody/tr'';
  13922.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  13923.     var elmt = elmts.iterateNext();
  13924.     if(elmt) {    // Search results page
  13925.       var uriRegexp = /^http:\/\/[^\/]+/;
  13926.       var m = uriRegexp.exec(uri);
  13927.       var postAction = doc.forms.namedItem("hitlist").getAttribute("action");
  13928.       var newUri = m[0]+postAction.substr(0, postAction.length-1)+"40";
  13929.       var titleRe = /<br>\s*(.*[^\s])\s*<br>/i;
  13930.       var items = new Array();
  13931.       do {
  13932.     var checkbox = doc.evaluate(''.//input[@type="checkbox"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13933.     // Collect title
  13934.     var title = doc.evaluate("./td[2]", elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13935.     if(checkbox && title) {
  13936.       items[checkbox.name] = Zotero.Utilities.cleanString(title);
  13937.     }
  13938.       } while(elmt = elmts.iterateNext());
  13939.       items = Zotero.selectItems(items);
  13940.  
  13941.       if(!items) {
  13942.     return true;
  13943.       }
  13944.  
  13945.       for(var i in items) {
  13946.     recNumbers.push(i);
  13947.       }
  13948.     } else {// Normal page
  13949.       // this regex will fail about 1/100,000,000 tries
  13950.       var uriRegexp = /^((.*?)\/([0-9]+?))\//;
  13951.       var m = uriRegexp.exec(uri);
  13952.       var newUri = m[1]+"/40"
  13953.       var elmts = doc.evaluate(''/html/body/form'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13954.       while(elmt = elmts.iterateNext()) {
  13955.     var initialText = doc.evaluate(''.//text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13956.     if(initialText && initialText.nodeValue && Zotero.Utilities.superCleanString(initialText.nodeValue) == "Viewing record") {
  13957.       recNumbers.push(doc.evaluate(''./b[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  13958.       break;
  13959.     }
  13960.       }
  13961.     }
  13962.  
  13963.     var translator = Zotero.loadTranslator("import");
  13964.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  13965.     var marc = translator.getTranslatorObject();
  13966.     Zotero.Utilities.loadDocument(newUri+''?marks=''+recNumbers.join(",")+''&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type='', function(doc) {
  13967.     var pre = doc.getElementsByTagName("pre");
  13968.     var text = pre[0].textContent;
  13969.     var documents = text.split("*** DOCUMENT BOUNDARY ***");
  13970.     for(var j=1; j<documents.length; j++) {
  13971.     var uri = newUri+"?marks="+recNumbers[j]+"&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=";
  13972.       var lines = documents[j].split("\n");
  13973.       var record = new marc.record();
  13974.       var tag, content;
  13975.       var ind = "";
  13976.       for(var i=0; i<lines.length; i++) {
  13977.         var line = lines[i];
  13978.           if(line[0] == "." && line.substr(4,2) == ". ") {
  13979.         if(tag) {
  13980.           content = content.replace(/\|([a-z])/g, marc.subfieldDelimiter+"$1");
  13981.           record.addField(tag, ind, content);
  13982.         }
  13983.           } else {
  13984.           content += " "+line.substr(6);
  13985.         continue;
  13986.           }
  13987.         tag = line.substr(1, 3);
  13988.         if(tag[0] != "0" || tag[1] != "0") {
  13989.           ind = line.substr(6, 2);
  13990.           content = line.substr(8);
  13991.         } else {
  13992.           content = line.substr(7);
  13993.           if(tag == "000") {
  13994.         tag = undefined;
  13995.           record.leader = "00000"+content;
  13996.         Zotero.debug("the leader is: "+record.leader);
  13997.           }
  13998.         }
  13999.       }
  14000.  
  14001.       var newItem = new Zotero.Item();
  14002.       record.translate(newItem);
  14003.       var domain = url.match(/https?:\/\/([^/]+)/);
  14004.       newItem.repository = domain[1]+" Library Catalog";
  14005.         newItem.complete();
  14006.     }
  14007.     Zotero.done();
  14008.     });
  14009.     Zotero.wait();
  14010.   }
  14011. }');
  14012.  
  14013. REPLACE INTO translators VALUES ('a69deb08-47d9-46ad-afca-bc3a2499ad34', '1.0.0b4.r5', '', '2008-05-15 00:30:00', '1', '100', '4', 'Royal Historical Society', 'Michael Berkowitz', 'http://www.rhs.ac.uk/bibl/', 
  14014. 'function detectWeb(doc, url) {
  14015.     if (doc.evaluate(''//tr/td[3][@class="bib_data"]/a[@class="bibref"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14016.         return "multiple";
  14017.     } else if (doc.evaluate(''//a[text() = "View records in XML"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14018.         return "book";
  14019.     }
  14020. }', 
  14021. 'function doWeb(doc, url) {
  14022.     var books = new Array();
  14023.     if (detectWeb(doc, url) == "multiple") {
  14024.         var items = new Object();
  14025.         var xpath = ''//a[@class="bibref"]'';
  14026.         var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  14027.         var result;
  14028.         while (result = results.iterateNext()) {
  14029.             items[result.href] = Zotero.Utilities.trimInternal(result.textContent);
  14030.         }
  14031.         items = Zotero.selectItems(items);
  14032.         for (var i in items) {
  14033.             books.push(i.replace(/DATABASE=[^&]+/, "DATABASE=xmlcatalo"));
  14034.         }
  14035.     } else {
  14036.         books = [url.replace(/DATABASE=[^&]+/, "DATABASE=xmlcatalo")];
  14037.     }
  14038.     for each (var link in books) {
  14039.         Zotero.Utilities.HTTP.doGet(link, function(text) {
  14040.             text = text.replace(/<\?[^?]+\?>/, "");
  14041.             var xml = new XML(text);
  14042.             xml = xml..recordList;
  14043.             
  14044.             var itemtype = "book";
  14045.             if (xml..journal_title.length() != 0) itemtype = "journalArticle";
  14046.             
  14047.             var item = new Zotero.Item(itemtype);
  14048.             item.title = Zotero.Utilities.capitalizeTitle(xml..title.toString());
  14049.             for (var i = 0; i < xml..author.length(); i++) {
  14050.                 var name = xml..author[i].toString().match(/^[^,]+,[^,]+/)[0].split(/,\s+/);
  14051.                 item.creators.push({lastName:name[0], firstName:name[1], creatorType:"author"});
  14052.             }
  14053.             if (item.itemType == "book") {
  14054.                 item.place = xml..place_of_publication.toString();
  14055.                 item.publisher = xml..publisher.toString();
  14056.                 item.date = xml..publication_year.toString();
  14057.             } else if (item.itemType == "journalArticle") {
  14058.                 item.publicationTitle = xml..journal_title.toString();
  14059.                 var voliss = xml..journal_number.split(":");
  14060.                 Zotero.debug(voliss);
  14061.                 item.volume = voliss[0];
  14062.                 item.issue = voliss[1];
  14063.                 item.date = xml..journal_issue_year;
  14064.                 item.pages = xml..journal_pages;
  14065.             }
  14066.             
  14067.             item.complete();
  14068.         });
  14069.         Zotero.done;
  14070.     }
  14071.     Zotero.wait();
  14072. }');
  14073.  
  14074.  
  14075. REPLACE INTO translators VALUES ('d921155f-0186-1684-615c-ca57682ced9b', '1.0.0b4.r1', '', '2009-01-28 18:10:00', 1, 100, 4, 'JSTOR', 'Simon Kornblith, Sean Takats, Michael Berkowitz and Eli Osherovich', 'https?://[^/]*jstor\.org[^/]*/(action/(showArticle|doBasicSearch|doAdvancedSearch|doLocatorSearch)|stable/|pss/)',
  14076. 'function detectWeb(doc, url) {
  14077.     var namespace = doc.documentElement.namespaceURI;
  14078.     var nsResolver = namespace ? function(prefix) {
  14079.     if (prefix == ''x'') return namespace; else return null;
  14080.     } : null;
  14081.     
  14082.     // See if this is a seach results page or Issue content
  14083.     if (doc.title == "JSTOR: Search Results" || url.match(/\/i\d+/)) {
  14084.     return "multiple";
  14085.     } else if(url.indexOf("/search/") != -1) {
  14086.     return false;
  14087.     }
  14088.     
  14089.     // If this is a view page, find the link to the citation
  14090.     var xpath = ''//a[@id="favorites"]'';
  14091.     var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  14092.     if(elmt || url.match(/pss/)) {
  14093.     return "journalArticle";
  14094.     }
  14095. }',
  14096. 'function doWeb(doc, url) {
  14097.     var namespace = doc.documentElement.namespaceURI;
  14098.     var nsResolver = namespace ? function(prefix) {
  14099.     if (prefix == ''x'') return namespace; else return null;
  14100.     } : null;
  14101.  
  14102.     var host = doc.location.host;
  14103.     
  14104.     // If this is a view page, find the link to the citation
  14105.     var xpath = ''//a[@id="favorites"]'';
  14106.     var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  14107.     var allJids = new Array();
  14108.     if (elmt && /jid=(\d+)/.test(elmt.href)) {
  14109.     allJids.push(RegExp.$1);
  14110.     Zotero.debug("JID found 1 " + jid);
  14111.     }
  14112.     else if (/(?:pss|stable)\/(\d+)/.test(url)) {
  14113.     Zotero.debug("URL " + url);
  14114.     allJids.push(RegExp.$1);
  14115.     Zotero.debug("JID found 2 " + jid);
  14116.     } 
  14117.     else {
  14118.     // We have multiple results
  14119.     var resultsBlock = doc.evaluate(''//fieldset[@id="results"]'', doc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  14120.     if (! resultsBlock) {
  14121.         return true;
  14122.     }
  14123.  
  14124.     var allTitlesElmts = doc.evaluate(''//li/ul/li/a[@class="title"]'', resultsBlock, nsResolver,  XPathResult.ANY_TYPE, null);
  14125.     var currTitleElmt;
  14126.     var availableItems = new Object();
  14127.     while (currTitleElmt = allTitlesElmts.iterateNext()) {
  14128.         var title = currTitleElmt.textContent;
  14129.         var jid = currTitleElmt.href.match(/stable\/(\d+)/)[1];
  14130.         if (jid) {
  14131.         availableItems[jid] = title;
  14132.         }
  14133.         Zotero.debug("Found title " + title+jid);
  14134.     }
  14135.     Zotero.debug("End of titles");
  14136.     
  14137.     var selectedItems = Zotero.selectItems(availableItems);
  14138.     if (!selectedItems) {
  14139.         return true;
  14140.     }
  14141.     for (var j in selectedItems) {
  14142.         Zotero.debug("Pushing " + j);
  14143.         allJids.push(j);
  14144.     }
  14145.     }
  14146.     
  14147.     for (var i in allJids) {
  14148.     var downloadString = "&suffix="+allJids[i];
  14149.     Zotero.Utilities.HTTP.doPost("http://"+host+"/action/downloadSingleCitation?format=refman&direct=true&singleCitation=true",downloadString,  function(text) {
  14150.         // load translator for RIS
  14151.         var translator = Zotero.loadTranslator("import");
  14152.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  14153.         translator.setString(text);
  14154.         translator.setHandler("itemDone", function(obj, item) {
  14155.             if(item.notes && item.notes[0]) {
  14156.                 // For some reason JSTOR exports abstract with ''AB'' tag istead of ''N1''
  14157.                 item.abstractNote = item.notes[0].note;
  14158.                 
  14159.                 delete item.notes;
  14160.                 item.notes = undefined;
  14161.             }
  14162.             item.attachments[0].title = item.title;
  14163.             item.attachments[0].mimeType = "text/html";
  14164.             
  14165.             if (/stable\/(\d+)/.test(item.url)) {
  14166.                 var localJid = RegExp.$1;
  14167.                 
  14168.                 // Add DOI
  14169.                 if (! item.DOI) {
  14170.                 item.DOI = "10.2307/"+localJid;
  14171.                 }
  14172.                 var pdfurl = "http://"+ host + "/stable/pdfplus/" + localJid + ".pdf";
  14173.                 item.attachments.push({url:pdfurl, title:"JSTOR Full Text PDF", mimeType:"application/pdf"});
  14174.             }
  14175.             item.complete();
  14176.             });
  14177.         
  14178.         translator.translate();
  14179.         
  14180.         Zotero.done();
  14181.         });
  14182.     }
  14183. }');
  14184.  
  14185.  
  14186. REPLACE INTO translators VALUES ('e8fc7ebc-b63d-4eb3-a16c-91da232f7220', '1.0.0b4.r5', '', '2008-02-12 10:00:00', '0', '100', '4', 'Aluka', 'Sean Takats', 'https?://(?:www\.)aluka.org/action/(?:showMetadata\?doi=[^&]+|doSearch\?|doBrowseResults\?)', 
  14187. 'function detectWeb(doc, url){
  14188.     var namespace = doc.documentElement.namespaceURI;
  14189.     var nsResolver = namespace ? function(prefix) {
  14190.         if (prefix == ''x'') return namespace; else return null;
  14191.     } : null;
  14192.         
  14193.     var xpath = ''//a[@class="title"]'';
  14194.  
  14195.     if (url.match(/showMetadata\?doi=[^&]+/)){
  14196.         return "document";
  14197.     } else if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  14198.         return "multiple";
  14199.     }
  14200. }', 
  14201. '// Aluka types we can import
  14202. // TODO: Improve support for other Aluka item types?
  14203. // Correspondence, Circulars, Newsletters, Interviews, Pamphlets, Policy Documents, Posters, Press Releases, Reports, Testimonies, Transcripts
  14204. var typeMap = {
  14205.     "Books":"book",
  14206.     "Aluka Essays":"report",
  14207.     "photograph":"artwork",
  14208.     "Photographs":"artwork",
  14209.     "Panoramas":"artwork",
  14210.     "Journals (Periodicals)":"journalArticle",
  14211.     "Articles":"journalArticle",
  14212.     "Correspondence":"letter",
  14213.     "Interviews":"interview",
  14214.     "Reports":"report"
  14215. }
  14216.  
  14217. function doWeb(doc, url){
  14218.     var urlString = "http://www.aluka.org/action/showPrimeXML?doi=" ;
  14219.     var uris = new Array();
  14220.     var m = url.match(/showMetadata\?doi=([^&]+)/);
  14221.     if (m) { //single page
  14222.         uris.push(urlString+ m[1]);
  14223.     } else { //search results page
  14224.         var namespace = doc.documentElement.namespaceURI;
  14225.         var nsResolver = namespace ? function(prefix) {
  14226.         if (prefix == ''x'') return namespace; else return null;
  14227.         } : null;
  14228.             
  14229.         var xpath = ''//a[@class="title"]'';
  14230.         var items = new Object();
  14231.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  14232.         var elmt;
  14233.         while (elmt = elmts.iterateNext()) {
  14234.             var title = elmt.textContent;
  14235.             var link = elmt.href;
  14236.             var m = link.match(/showMetadata\?doi=([^&]+)/);
  14237.             if (title && m){
  14238.                 items[m[1]] = title;
  14239.             }
  14240.         }
  14241.         
  14242.         var items = Zotero.selectItems(items);
  14243.         if(!items) {
  14244.             return true;
  14245.         }
  14246.         
  14247.         for(var i in items) {
  14248.             uris.push(urlString + i);
  14249.         }
  14250.     }
  14251.     // http://www.aluka.org/action/showPrimeXML?doi=10.5555/AL.SFF.DOCUMENT.cbp1008
  14252.  
  14253.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  14254.         text = text.replace(/<\?xml[^>]*\?>/, ""); // strip xml header
  14255.         text = text.replace(/(<[^>\.]*)\.([^>]*>)/g, "$1_$2");    // replace dots in tags with underscores
  14256.         var xml = new XML(text);
  14257.         var metadata = xml..MetadataDC;
  14258.         var itemType = "Unknown";
  14259.         if (metadata.length()){
  14260.             itemType = "document";
  14261.             if (metadata[0].Type.length()){
  14262.                 var value = metadata[0].Type[0].text().toString();
  14263.                 if(typeMap[value]) {
  14264.                     itemType = typeMap[value];
  14265.                 } else {
  14266.                     Zotero.debug("Unmapped Aluka Type: " + value);
  14267.                 }        
  14268.             }
  14269.             var newItem = new Zotero.Item(itemType);
  14270.             var title = "";
  14271.             if (metadata[0].Title.length()){
  14272.                 var title = Zotero.Utilities.trimInternal(metadata[0].Title[0].text().toString());
  14273.                 if (title == ""){
  14274.                     title = " ";
  14275.                 }
  14276.                 newItem.title = title;
  14277.             }
  14278.             if (metadata[0].Title_Alternative.length()){
  14279.                 newItem.extra = Zotero.Utilities.trimInternal(metadata[0].Title_Alternative[0].text().toString());
  14280.             }
  14281.             for(var i=0; i<metadata[0].Subject_Enriched.length(); i++) {
  14282.                 newItem.tags.push(Zotero.Utilities.trimInternal(metadata[0].Subject_Enriched[i].text().toString()));
  14283.             }
  14284.             for(var i=0; i<metadata[0].Coverage_Spatial.length(); i++) {
  14285.                 newItem.tags.push(Zotero.Utilities.trimInternal(metadata[0].Coverage_Spatial[i].text().toString()));
  14286.             }
  14287.             for(var i=0; i<metadata[0].Coverage_Temporal.length(); i++) {
  14288.                 newItem.tags.push(Zotero.Utilities.trimInternal(metadata[0].Coverage_Temporal[i].text().toString()));
  14289.             }
  14290. //    TODO: decide whether to uncomment below code to import species data as tags
  14291. //            for(var i=0; i<xml..TopicName.length(); i++) {
  14292. //                newItem.tags.push(Zotero.Utilities.trimInternal(xml..TopicName[i].text().toString()));
  14293. //            }
  14294.  
  14295.             if (metadata[0].Date.length()){
  14296.                 var date = metadata[0].Date[0].text().toString();
  14297.                 if (date.match(/^\d{8}$/)){
  14298.                     date = date.substr(0, 4) + "-" + date.substr(4, 2) + "-" + date.substr(6, 2);
  14299.                 }
  14300.                 newItem.date = date;
  14301.             }
  14302.             if (metadata[0].Creator.length()){
  14303.                 var authors = metadata[0].Creator;
  14304.                 var type = "author";
  14305.                 for(var j=0; j<authors.length(); j++) {
  14306.                     Zotero.debug("author: " + authors[j]);
  14307.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true));
  14308.                 }
  14309.             }
  14310.             if (metadata[0].Contributor.length()){
  14311.                 var authors = metadata[0].Contributor;
  14312.                 var type = "contributor";
  14313.                 for(var j=0; j<authors.length(); j++) {
  14314.                     Zotero.debug("author: " + authors[j]);
  14315.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true));
  14316.                 }
  14317.             }
  14318.             if (metadata[0].Publisher.length()){
  14319.                 newItem.publisher = Zotero.Utilities.trimInternal(metadata[0].Publisher[0].text().toString());
  14320.             }
  14321.             if (metadata[0].Format_Medium.length()){
  14322.                 newItem.medium = Zotero.Utilities.trimInternal(metadata[0].Format_Medium[0].text().toString());
  14323.             }
  14324.             if (metadata[0].Language.length()){
  14325.                 newItem.language = Zotero.Utilities.trimInternal(metadata[0].Language[0].text().toString());
  14326.             }    
  14327.             if (metadata[0].Description.length()){
  14328.                 newItem.abstractNote = metadata[0].Description[0].text().toString();
  14329.             }
  14330.             if (metadata[0].Format_Extent.length()){
  14331.                 newItem.pages = Zotero.Utilities.trimInternal(metadata[0].Format_Extent[0].text().toString());
  14332.             }
  14333.             var doi = xml..DOI;
  14334.             if (doi.length()){
  14335.                 newItem.DOI = doi[0];
  14336.                 var newUrl = "http://www.aluka.org/action/showMetadata?doi=" + doi[0];
  14337.                 newItem.attachments.push({title:"Aluka Link", snapshot:false, mimeType:"text/html", url:newUrl});
  14338.                 var pdfUrl = "http://ts-den.aluka.org/delivery/aluka-contentdelivery/pdf/" + doi[0] + "?type=img&q=high";
  14339.                 newItem.attachments.push({url:pdfUrl});
  14340.                 newItem.url = newUrl;
  14341.             }
  14342.             var rights = xml..Rights.Attribution;
  14343.             if (rights.length()){
  14344.                 newItem.rights = rights[0];
  14345.             }
  14346.             if (metadata[0].Rights.length()){
  14347.                 newItem.rights = Zotero.Utilities.trimInternal(metadata[0].Rights[0].text().toString());
  14348.             }
  14349.             if (metadata[0].Source.length()){
  14350.                 newItem.repository = "Aluka: " + Zotero.Utilities.trimInternal(metadata[0].Source[0].text().toString());
  14351.             }
  14352.             if (metadata[0].Relation.length()){
  14353.                 newItem.callNumber = Zotero.Utilities.trimInternal(metadata[0].Relation[0].text().toString());
  14354.             }
  14355.             newItem.complete();
  14356.         } else {
  14357.             Zotero.debug("No Dublin Core XML data");
  14358.             return false;
  14359.         }
  14360.         Zotero.done();
  14361.     });
  14362.     Zotero.wait();
  14363. }');
  14364.  
  14365. REPLACE INTO translators VALUES ('e85a3134-8c1a-8644-6926-584c8565f23e', '1.0.0b4.r1', '', '2008-05-06 08:15:00', '1', '100', '4', 'History Cooperative', 'Simon Kornblith', 'https?://[^/]*historycooperative\.org[^/]*/(?:journals/.+/.+/.+\.s?html$|cgi-bin/search.cgi|journals/(?!cp|whc).+/.+/)', 
  14366. 'function detectWeb(doc, url) {
  14367.     var contents = doc.title.replace("Contents", "");
  14368.     if(doc.title != contents || doc.title == "History Cooperative: Search Results") {
  14369.         return "multiple";
  14370.     } else {
  14371.         return "journalArticle";
  14372.     }
  14373. }', 
  14374. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  14375.     var field = metaTags.namedItem(field);
  14376.     if(field) {
  14377.         newItem[zoteroField] = field.getAttribute("content");
  14378.     }
  14379. }
  14380.  
  14381. function scrape(doc) {
  14382.     var newItem = new Zotero.Item("journalArticle");
  14383.     newItem.url = doc.location.href;
  14384.     
  14385.     var month, year;
  14386.     var metaTags = doc.getElementsByTagName("meta");
  14387.  
  14388.     associateMeta(newItem, metaTags, "Journal", "publicationTitle");
  14389.     associateMeta(newItem, metaTags, "Volume", "volume");
  14390.     associateMeta(newItem, metaTags, "Issue", "issue");
  14391.  
  14392.     // grab title without using meta tag, since when titles have quotes History
  14393.     // Cooperative can''t create a proper meta tag
  14394.  
  14395.     // 16apr08 - fwg
  14396.     // as of now, title meta tags are properly escaped, but 
  14397.     // in the case of book reviews, the title field is set to one of many (~10) variations
  14398.     // of "Book Review", so it''s easiest to get the book title from the proprietary tags (below) as originally coded.
  14399.     
  14400.     var titleRe = /<!--_title_-->(.*)<!--_\/title_-->/;
  14401.     
  14402.     // 16apr08 - fwg
  14403.     // added trimInteral, since some pages have extraneous line breaks in source code
  14404.     // added unescapeHTML to make quotes nice 
  14405.     var m = titleRe.exec(Zotero.Utilities.trimInternal(doc.getElementsByTagName("body")[0].innerHTML));
  14406.     if(m) {
  14407.         newItem.title = Zotero.Utilities.trimInternal(Zotero.Utilities.unescapeHTML(m[1]));
  14408.     } else {
  14409.         var namespace = doc.documentElement.namespaceURI;
  14410.         var nsResolver = namespace ? function(prefix) {
  14411.             if (prefix == ''x'') return namespace; else return null;
  14412.         } : null;
  14413.  
  14414.     var bookTitle;
  14415.     
  14416.     //different journals want their reviewed book titles formatted in different ways (or have bizarre markup)
  14417.     jNames = new Array ("The Western Historical Quarterly", "Journal of American Ethnic History", "Labour History","Environmental History",
  14418.                         "New York History","Indiana Magazine of History");
  14419.                            
  14420.     jXpaths = new Array("//tr[4]/td[3]/table/tbody/tr[1]/td/b/i",
  14421.                         "//[4]/td[3]/table/tbody/tr[1]/td/b/i",
  14422.                         "//tr[4]/td[3]/table/tbody/tr[1]/td/b/b/i",
  14423.                         "//tr[4]/td[3]/table/tbody/tr[1]/td/b[1]",
  14424.                         "//tr[4]/td[3]/p[1]/font/b/i",
  14425.                         "//tr[4]/td[3]/table[1]/tbody/tr[1]/td/h4/font/i"
  14426.                         );
  14427.     
  14428.     // 16apr08 - fwg
  14429.     // figure out which Xpath to use
  14430.     // the below Xpath seems to work much of the time, so we default to it
  14431.     var jXpath =''//tr[4]/td[3]/table/tbody/tr[1]/td/i'';
  14432.     
  14433.     for (var i=0; i < jNames.length; i++) {
  14434.         if (newItem.publicationTitle == jNames[i]) {
  14435.             //Zotero.debug("using Xpath for: " + jNames[i]);
  14436.             //Zotero.debug("Xpath is: " + jXpaths[i]);
  14437.             jXpath = jXpaths[i];
  14438.         }
  14439.     }    
  14440.     
  14441.     bookTitle = doc.evaluate(jXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  14442.     //Zotero.debug("bookTitle: " + bookTitle);
  14443.         
  14444.     // 16apr08 - fwg
  14445.     //instead of general failure, let''s admit we can''t get the title and save everything else
  14446.     // this is useful when a book review page has a one-off introduction or strange formatting that we can''t anticipate.
  14447.     if (bookTitle) {
  14448.         newItem.title = "Review of " + bookTitle.textContent;
  14449.     } else {
  14450.         newItem.title = "Review of <unable to get title from page>";
  14451.         }
  14452.     }
  14453.     
  14454.     var author = metaTags.namedItem("Author");
  14455.     if(author) {
  14456.         var authors = author.getAttribute("content").split(" and ");
  14457.         for(j in authors) {
  14458.             authors[j] = authors[j].replace("Reviewed by ", "");
  14459.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
  14460.         }
  14461.     }
  14462.     
  14463.     var month = metaTags.namedItem("PublicationMonth");
  14464.     var year = metaTags.namedItem("PublicationYear");
  14465.     if(month && year) {
  14466.         newItem.date = month.getAttribute("content")+" "+year.getAttribute("content");
  14467.     }
  14468.     
  14469.     newItem.attachments.push({document:doc, title:"History Cooperative Snapshot"});
  14470.     
  14471.     newItem.complete();
  14472. }
  14473.  
  14474. function doWeb(doc, url) {
  14475.     var contents = doc.title.replace(" Contents | ", "");
  14476.     if(doc.title != contents || doc.title == "History Cooperative: Search Results") {
  14477.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/journals/.+/.+/.+\.html$'');
  14478.         items = Zotero.selectItems(items);
  14479.         
  14480.         if(!items) {
  14481.             return true;
  14482.         }
  14483.         
  14484.         var uris = new Array();
  14485.         for(var i in items) {
  14486.             uris.push(i);
  14487.         }
  14488.         
  14489.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  14490.             function() { Zotero.done(); }, null);
  14491.         
  14492.         Zotero.wait();
  14493.     } else {
  14494.         scrape(doc);
  14495.     }
  14496. }');
  14497.  
  14498. REPLACE INTO translators VALUES ('4c9dbe33-e64f-4536-a02f-f347fa1f187d', '1.0.0b4.r5', '', '2008-04-03 19:45:00', '0', '100', '4', 'BioInfoBank', 'Michael Berkowitz', 'http://lib.bioinfo.pl/', 
  14499. 'function detectWeb(doc, url) {
  14500.     return "multiple";
  14501. }', 
  14502. 'function doWeb(doc, url) {
  14503.     var pmids = new Array();
  14504.     var items = new Object();
  14505.     var titles = doc.evaluate(''//div[@class="css_pmid"]/div[@class="css_pmid_title"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  14506.     var title;
  14507.     while (title = titles.iterateNext()) {
  14508.         items[title.href] = Zotero.Utilities.trimInternal(title.textContent);
  14509.     }
  14510.     items = Zotero.selectItems(items);
  14511.     for (var i in items) {
  14512.         pmids.push(i.match(/pmid:(\d+)/)[1]);
  14513.     }
  14514.     var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&retmode=xml&rettype=citation&id="+pmids.join(",");
  14515.     Zotero.Utilities.HTTP.doGet(newUri, function(text) {
  14516.         // Remove xml parse instruction and doctype
  14517.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  14518.  
  14519.         var xml = new XML(text);
  14520.         for(var i=0; i<xml.PubmedArticle.length(); i++) {
  14521.             var newItem = new Zotero.Item("journalArticle");
  14522.  
  14523.             var citation = xml.PubmedArticle[i].MedlineCitation;
  14524.  
  14525.             var PMID = citation.PMID.text().toString();
  14526.             newItem.extra = "PMID: "+PMID;
  14527.             // add attachments
  14528.             if(doc) {
  14529.                 newItem.attachments.push({document:doc, title:"PubMed Snapshot"});
  14530.             } else {
  14531.                 var url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids="+PMID;
  14532.                 newItem.attachments.push({url:url, title:"PubMed Snapshot",
  14533.                              mimeType:"text/html"});
  14534.             }
  14535.  
  14536.             var article = citation.Article;
  14537.             if(article.ArticleTitle.length()) {
  14538.                 var title = article.ArticleTitle.text().toString();
  14539.                 if(title.substr(-1) == ".") {
  14540.                     title = title.substring(0, title.length-1);
  14541.                 }
  14542.                 newItem.title = title;
  14543.             }
  14544.  
  14545.             if (article.Pagination.MedlinePgn.length()){
  14546.                 newItem.pages = article.Pagination.MedlinePgn.text().toString();
  14547.             }
  14548.  
  14549.             if(article.Journal.length()) {
  14550.                 var issn = article.Journal.ISSN.text().toString();
  14551.                 if(issn) {
  14552.                     newItem.ISSN = issn.replace(/[^0-9]/g, "");
  14553.                 }
  14554.  
  14555.                 newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString());
  14556.                 if(article.Journal.Title.length()) {
  14557.                     newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString());
  14558.                 } else if(citation.MedlineJournalInfo.MedlineTA.length()) {
  14559.                     newItem.publicationTitle = newItem.journalAbbreviation;
  14560.                 }
  14561.  
  14562.                 if(article.Journal.JournalIssue.length()) {
  14563.                     newItem.volume = article.Journal.JournalIssue.Volume.text().toString();
  14564.                     newItem.issue = article.Journal.JournalIssue.Issue.text().toString();
  14565.                     if(article.Journal.JournalIssue.PubDate.length()) {    // try to get the date
  14566.                         if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") {
  14567.                             newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString();
  14568.                         } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") {
  14569.                             newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString();
  14570.                         } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") {
  14571.                             newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString();
  14572.                         }
  14573.                     }
  14574.                 }
  14575.             }
  14576.  
  14577.             if(article.AuthorList.length() && article.AuthorList.Author.length()) {
  14578.                 var authors = article.AuthorList.Author;
  14579.                 for(var j=0; j<authors.length(); j++) {
  14580.                     var lastName = authors[j].LastName.text().toString();
  14581.                     var firstName = authors[j].FirstName.text().toString();
  14582.                     if(firstName == "") {
  14583.                         var firstName = authors[j].ForeName.text().toString();
  14584.                     }
  14585.                     if(firstName || lastName) {
  14586.                         newItem.creators.push({lastName:lastName, firstName:firstName});
  14587.                     }
  14588.                 }
  14589.             }
  14590.             
  14591.             
  14592.             if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) {
  14593.                 var keywords = citation.MeshHeadingList.MeshHeading;
  14594.                 for (var k = 0 ; k < keywords.length() ; k++) {
  14595.                     newItem.tags.push(keywords[k].DescriptorName.text().toString());
  14596.                 }
  14597.             }
  14598.             newItem.abstractNote = article.Abstract.AbstractText.toString()
  14599.             
  14600.             newItem.complete();
  14601.         }
  14602.  
  14603.         Zotero.done();
  14604.     });
  14605. }');
  14606.  
  14607. REPLACE INTO translators VALUES ('2e43f4a9-d2e2-4112-a6ef-b3528b39b4d2', '1.0.0b4.r5', '', '2008-04-28 17:50:00', '1', '100', '4', 'MIT Press Journals', 'Michael Berkowitz', 'http://www.mitpressjournals.org/', 
  14608. 'function detectWeb(doc, url) {
  14609.     if (url.match(/action\/doSearch/) || url.match(/toc\//)) {
  14610.         return "multiple";
  14611.     } else if (url.match(/doi\/abs\//)) {
  14612.         return "journalArticle";
  14613.     }
  14614. }', 
  14615. 'function getDOI(str) {
  14616.     return str.match(/doi\/abs\/([^?]+)/)[1];
  14617. }
  14618.     
  14619. function doWeb(doc, url) {
  14620.     var articles = new Array();
  14621.     if (detectWeb(doc, url) == "multiple") {
  14622.         var items = new Object();
  14623.         var links = doc.evaluate(''//table[@class="articleEntry"]/tbody/tr//a[text() = "First Page" or text() = "Citation" or text() = "Abstract"]'', doc, null, XPathResult.ANY_TYPE, null);
  14624.         var titles = doc.evaluate(''//table[@class="articleEntry"]/tbody/tr//div[@class="arttitle"]'', doc, null, XPathResult.ANY_TYPE, null);
  14625.         var link, title;
  14626.         while ((link = links.iterateNext()) && (title = titles.iterateNext())) {
  14627.             items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  14628.         }
  14629.         items = Zotero.selectItems(items);
  14630.         for (var i in items) {
  14631.             articles.push(''http://www.mitpressjournals.org/doi/abs/'' + getDOI(i));
  14632.         }
  14633.     } else {
  14634.         articles = [''http://www.mitpressjournals.org/doi/abs/'' + getDOI(url)];
  14635.     }
  14636.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  14637.         if (newDoc.evaluate(''//div[@class="abstractSection"]/p[contains(@class, "last") or contains(@class, "first")]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14638.             var abs = Zotero.Utilities.trimInternal(newDoc.evaluate(''//div[@class="abstractSection"]/p[contains(@class, "last") or contains(@class, "first")]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  14639.         }
  14640.         var doi = getDOI(newDoc.location.href);
  14641.         var risurl = ''http://www.mitpressjournals.org/action/downloadCitation?doi='' + doi + ''&include=cit&format=refman&direct=on&submit=Download+article+metadata'';        
  14642.         var pdfurl = newDoc.location.href.replace("/doi/abs/", "/doi/pdf/");
  14643.         Zotero.Utilities.HTTP.doGet(risurl, function(text) {
  14644.             var translator = Zotero.loadTranslator("import");
  14645.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  14646.             translator.setString(text);
  14647.             translator.setHandler("itemDone", function(obj, item) {
  14648.                 if (item.notes[0][''note''].match(/doi:/)) {
  14649.                     item.DOI = item.notes[0][''note''].substr(5);
  14650.                     item.notes = new Array();
  14651.                 }
  14652.                 item.attachments[0].title= item.publicationTitle + " Snapshot";
  14653.                 item.attachments[0].mimeType = "text/html";
  14654.                 item.attachments.push({url:pdfurl, title:item.publicationTitle + " Full Text PDF", mimeType:"application/pdf"});
  14655.                 if (abs) item.abstractNote = abs;
  14656.                 item.complete();    
  14657.             });
  14658.             translator.translate();
  14659.         });
  14660.     }, function() {Zotero.done;});
  14661.     Zotero.wait();
  14662. }');
  14663.  
  14664. REPLACE INTO translators VALUES ('b0abb562-218c-4bf6-af66-c320fdb8ddd3', '1.0.0b4.r5', '', '2008-04-01 04:50:00', '0', '100', '4', 'Philosopher''s Imprint', 'Michael Berkowitz', 'http://quod.lib.umich.edu/cgi/t/', 
  14665. 'function detectWeb(doc, url) {
  14666.     if (doc.evaluate(''//div/span[text() = "Search Results"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14667.         return "multiple";
  14668.     } else if (url.match(/\d+\.\d+\.\d+/)) {
  14669.         return "journalArticle";
  14670.     }
  14671. }', 
  14672. 'function getID(str) {
  14673.     return str.match(/\d+\.\d+\.\d+/)[0];
  14674. }
  14675. function doWeb(doc, url) {
  14676.     var ids = new Array();
  14677.     if (detectWeb(doc, url) == "multiple") {
  14678.         var items = new Object();
  14679.         var titles = doc.evaluate(''//div[@class="itemcitation"]//a'', doc, null, XPathResult.ANY_TYPE, null);
  14680.         var title;
  14681.         while (title = titles.iterateNext()) {
  14682.             items[title.href] = title.textContent;
  14683.         }
  14684.         items = Zotero.selectItems(items);
  14685.         for (var i in items) {
  14686.             ids.push(''http://quod.lib.umich.edu/cgi/t/text/text-idx?c=phimp;view=text;rgn=main;idno='' + getID(i));
  14687.         }
  14688.     } else {
  14689.         ids = [''http://quod.lib.umich.edu/cgi/t/text/text-idx?c=phimp;view=text;rgn=main;idno='' + getID(url)];
  14690.     }
  14691.     Zotero.Utilities.processDocuments(ids, function(newDoc) {
  14692.         var rows = newDoc.evaluate(''//tr[td[@id="labelcell"]]'', newDoc, null, XPathResult.ANY_TYPE, null);
  14693.         var row;
  14694.         var data = new Object();
  14695.         while (row = rows.iterateNext()) {
  14696.             var heading = newDoc.evaluate(''./td[1]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  14697.             var value = newDoc.evaluate(''./td[2]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  14698.             data[heading.replace(/[\s:]/g, "")] = value;
  14699.         }
  14700.         var item = new Zotero.Item("journalArticle");
  14701.         item.title = Zotero.Utilities.trimInternal(data[''Title'']);
  14702.         if (data[''Author'']) {
  14703.             item.creators.push(Zotero.Utilities.cleanAuthor(data[''Author''], "author"));
  14704.         } else if (data[''Authors'']) {
  14705.             var authors = data[''Authors''].split(",");
  14706.             for each (var a in authors) {
  14707.                 item.creators.push(Zotero.Utilities.cleanAuthor(a, "author"));
  14708.             }
  14709.         }
  14710.         if (data[''Keywords'']) {
  14711.             var kws = data[''Keywords''].split(/\n/);
  14712.             for each (var kw in kws) {
  14713.                 if (kw != "") item.tags.push(kw);
  14714.             }
  14715.         }
  14716.         var voliss = data[''Source''].replace(item.title, "");
  14717.         if (item.creators.length > 1) {
  14718.             voliss = voliss.replace(data[''Authors''], "");
  14719.         } else if (item.creators.length == 1) {
  14720.             voliss = voliss.replace(data[''Author''], "");
  14721.         }
  14722.         Zotero.debug(voliss);
  14723.         item.volume = voliss.match(/vol\.\s+(\d+)/)[1];
  14724.         item.issue = voliss.match(/no\.\s+(\d+)/)[1];
  14725.         item.pages = voliss.match(/pp\.\s+([\d\-]+)/)[1];
  14726.         item.date = Zotero.Utilities.trimInternal(voliss.match(/[^,]+$/)[0]);
  14727.         item.place = "Ann Arbor, MI";
  14728.         item.publisher = "University of Michigan";
  14729.         item.abstractNote = data[''Abstract''];
  14730.         item.url = data[''URL''];
  14731.         item.attachments = [
  14732.             {url:item.url, title:item.title + " Snapshot", mimeType:"text/html"},
  14733.             {url:''http://quod.lib.umich.edu/p/phimp/images/'' + getID(item.url) + ''.pdf'', title:"Philosopher''s Imprint Full Text PDF", mimeType:"application/pdf"}
  14734.         ];
  14735.         item.complete();
  14736.     }, function() {Zotero.done;});
  14737.     Zotero.wait();
  14738. }');
  14739.  
  14740. REPLACE INTO translators VALUES ('2a5dc3ed-ee5e-4bfb-baad-36ae007e40ce', '1.0.0b4.r5', '', '2008-04-01 04:50:00', '0', '100', '4', 'Berkeley Electronic Press', 'Michael Berkowitz', 'http://www.bepress.com/', 
  14741. 'function detectWeb(doc, url) {
  14742.     if (url.match("cgi/query.cgi")) {
  14743.         return "multiple";
  14744.     } else if (url.match(/vol[\d+]\/iss[\d]+/)) {
  14745.         return "journalArticle";
  14746.     }
  14747. }', 
  14748. 'var tagMap = {
  14749.     journal_title:"publicationTitle",
  14750.     title:"title",
  14751.     date:"date",
  14752.     volume:"volume",
  14753.     issue:"issue",
  14754.     abstract_html_url:"url",
  14755.     doi:"DOI"
  14756. }
  14757.  
  14758. function doWeb(doc, url) {
  14759.     var namespace = doc.documentElement.namespaceURI;
  14760.     var nsResolver = namespace ? function(prefix) {
  14761.     if (prefix == ''x'') return namespace; else return null;
  14762.     } : null;
  14763.  
  14764.     var articles = new Array();
  14765.     if (detectWeb(doc, url) == "multiple") {
  14766.         var items = new Object();
  14767.         var titles = doc.evaluate(''//table[@id="query"]/tbody/tr/td[4]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  14768.         var next_title;
  14769.         while (next_title = titles.iterateNext()) {
  14770.             items[next_title.href] = next_title.textContent;
  14771.         }
  14772.         items = Zotero.selectItems(items);
  14773.         for (var i in items) {
  14774.             articles.push(i);
  14775.         }
  14776.     } else {
  14777.         articles = [url];
  14778.     }
  14779.     Zotero.debug(articles);
  14780.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  14781.         var metatags = new Object();
  14782.         var metas = newDoc.evaluate(''//meta[contains(@name, "bepress_citation")]'', newDoc, null, XPathResult.ANY_TYPE, null);
  14783.         var next_meta;
  14784.         while (next_meta = metas.iterateNext()) {
  14785.             metatags[next_meta.name.replace("bepress_citation_", "")] = next_meta.content;
  14786.         }
  14787.         var item = new Zotero.Item("journalArticle");
  14788.         
  14789.         //regularly mapped tags
  14790.         for (var tag in tagMap) {
  14791.             if (metatags[tag]) {
  14792.                 item[tagMap[tag]] = metatags[tag];
  14793.             }
  14794.         }
  14795.         
  14796.         //authors
  14797.         var authors = metatags[''authors''].split(";");
  14798.         for each (var author in authors) {
  14799.             item.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  14800.         }
  14801.         
  14802.         //attachments
  14803.         item.attachments = [
  14804.             {url:item.url, title:item.title, mimeType:"text/html"},
  14805.             {url:metatags[''pdf_url''], title:"Berkeley Electronic Press Full Text PDF", mimeType:"application/pdf"}
  14806.         ];
  14807.         item.complete();
  14808.     }, function() {Zotero.done;});
  14809.     Zotero.wait();
  14810. }');
  14811.  
  14812. REPLACE INTO translators VALUES ('7cb0089b-9551-44b2-abca-eb03cbf586d9', '1.0.0b4.r5', '', '2008-08-04 07:10:00', '0', '100', '4', 'BioOne', 'Michael Berkowitz', 'http://[^/]*www.bioone.org[^/]*/', 
  14813. 'function detectWeb(doc, url) {
  14814.     if (url.indexOf("searchtype") != -1) {
  14815.         return "multiple";
  14816.     } else if (url.indexOf("get-document") != -1 || url.indexOf("get-abstract") != -1) {
  14817.         return "journalArticle";
  14818.     }
  14819. }', 
  14820. 'function createCitationURL(str) {
  14821.     str = str.match(/doi=([^&]+)/)[1];
  14822.     return "http://www.bioone.org/perlserv/?request=cite-builder&doi=" + str;
  14823. }
  14824.  
  14825. function doWeb(doc, url) {
  14826.     var host = doc.location.host;
  14827.     var articles = new Array();
  14828.     if (detectWeb(doc, url) == "multiple") {
  14829.         var items = new Object();
  14830.         var results = doc.evaluate(''//div[@class="content"]/table/tbody/tr/td[3][@class="group"]'', doc, null, XPathResult.ANY_TYPE, null);
  14831.         var next_result;
  14832.         while (next_result = results.iterateNext()) {
  14833.             var title = doc.evaluate(''.//span[@class="title"]'', next_result, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  14834.             var link = doc.evaluate(''.//tr[4]/td/a[1]'', next_result, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  14835.             items[link] = title;
  14836.         }
  14837.         items = Zotero.selectItems(items);
  14838.         for (var i in items) {
  14839.             articles.push(createCitationURL(i));
  14840.         }
  14841.     } else {
  14842.         articles = [createCitationURL(url)];
  14843.     }
  14844.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  14845.         var newlink = newDoc.evaluate(''//a[contains(@href, "refman")]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  14846.         Zotero.Utilities.HTTP.doGet(newlink, function(text) {
  14847.             var translator = Zotero.loadTranslator("import");
  14848.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  14849.             translator.setString(text);
  14850.             translator.setHandler("itemDone", function(obj, item) {
  14851.                 item.url = decodeURIComponent(item.url);
  14852.                 item.DOI = item.url.match(/http:\/\/dx\.doi\.org\/(.*)$/)[1];
  14853.                 var pdfurl = ''http://'' + host + ''/perlserv/?request=get-pdf&doi='' + item.DOI;
  14854.                 item.attachments = [
  14855.                     {url:item.url, title:item.title, mimeType:"text/html"},
  14856.                     {url:pdfurl, title:"BioOne Full Text PDF", mimeType:"application/pdf"}
  14857.                 ];
  14858.                 item.complete();
  14859.             });
  14860.             translator.translate();
  14861.         });
  14862.     }, function() {Zotero.done;});
  14863.     Zotero.wait();
  14864. }');
  14865.  
  14866. REPLACE INTO translators VALUES ('b8a86e36-c270-48c9-bdd1-22aaa167ef46', '1.0.0b4.r5', '', '2008-06-08 23:00:00', '0', '100', '4', 'Agencia del ISBN', 'Michael Berkowitz', 'http://www.mcu.es/webISBN', 
  14867. 'function detectWeb(doc, url) {
  14868.     if (doc.evaluate(''//div[@class="isbnResultado"]/div[@class="isbnResDescripcion"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14869.         return "multiple";
  14870.     } else if (doc.evaluate(''//div[@class="fichaISBN"]/div[@class="cabecera"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14871.         return "book";
  14872.     }
  14873. }', 
  14874. 'function doWeb(doc, url) {
  14875.     var books = new Array();
  14876.     if (detectWeb(doc, url) == "multiple") {
  14877.         var items = new Object();
  14878.         var boxes = doc.evaluate(''//div[@class="isbnResultado"]/div[@class="isbnResDescripcion"]'', doc, null, XPathResult.ANY_TYPE, null);
  14879.         var box;
  14880.         while (box = boxes.iterateNext()) {
  14881.             var book = doc.evaluate(''./p/span/strong/a'', box, null, XPathResult.ANY_TYPE, null).iterateNext();
  14882.             items[book.href] = book.textContent;
  14883.         }
  14884.         items = Zotero.selectItems(items);
  14885.         for (var i in items) {
  14886.             books.push(i);
  14887.         }
  14888.     } else {
  14889.         books = [url];
  14890.     }
  14891.     Zotero.Utilities.processDocuments(books, function(newDoc) {
  14892.         var data = new Object();
  14893.         var rows = newDoc.evaluate(''//div[@class="fichaISBN"]/table/tbody/tr'', newDoc, null, XPathResult.ANY_TYPE, null);
  14894.         var next_row;
  14895.         while (next_row = rows.iterateNext()) {
  14896.             var heading = newDoc.evaluate(''./th'', next_row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  14897.             var value = newDoc.evaluate(''./td'', next_row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  14898.             data[heading.replace(/\W/g, "")] = value;
  14899.         }
  14900.         var isbn = Zotero.Utilities.trimInternal(newDoc.evaluate(''//span[@class="cabTitulo"]/strong'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  14901.         var item = new Zotero.Item("book");
  14902.         item.ISBN = isbn;
  14903.         item.title = Zotero.Utilities.trimInternal(data[''Ttulo'']);
  14904.         
  14905.         author = data[''Autores''];
  14906.         if (author) {
  14907.             var authors = author.match(/\b.*,\s+\w+[^([]/g);
  14908.             for each (aut in authors) {
  14909.                 item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aut), "author", true));
  14910.             }
  14911.         }
  14912.         if (data[''Publicacin'']) item.publisher = Zotero.Utilities.trimInternal(data[''Publicacin'']);
  14913.         if (data[''FechaEdicin'']) item.date = Zotero.Utilities.trimInternal(data[''FechaEdicin'']);
  14914.         item.complete();
  14915.     }, function() {Zotero.done;});
  14916.     Zotero.wait();
  14917. }');
  14918.  
  14919. REPLACE INTO translators VALUES ('a14ac3eb-64a0-4179-970c-92ecc2fec992', '1.0.0b4.r5', '', '2008-04-01 04:50:00', '1', '100', '4', 'Scopus', 'Michael Berkowitz', 'http://[^/]*www.scopus.com[^/]*', 
  14920. 'function detectWeb(doc, url) {
  14921.     if (url.indexOf("/results/") != -1) {
  14922.         return "multiple";
  14923.     } else if (url.indexOf("/record/") != -1) {
  14924.         return "journalArticle";
  14925.     }
  14926. }', 
  14927. 'function getEID(url) {
  14928.     return url.match(/eid=([^&]+)/)[1];
  14929. }
  14930.  
  14931. function returnURL(eid) {
  14932.     return ''http://www.scopus.com/scopus/citation/output.url?origin=recordpage&eid='' + eid + ''&src=s&view=CiteAbsKeywsRefs'';
  14933. }
  14934.  
  14935.  
  14936. function doWeb(doc, url) {
  14937.     var namespace = doc.documentElement.namespaceURI;
  14938.     var nsResolver = namespace ? function(prefix) {
  14939.     if (prefix == ''x'') return namespace; else return null;
  14940.     } : null;
  14941.  
  14942.     var articles = new Array();
  14943.     if (detectWeb(doc, url) == "multiple") {
  14944.         items = new Object();
  14945.         var boxes = doc.evaluate(''//table/tbody/tr[@class]/td[@class="fldtextPad"][1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  14946.         var box;
  14947.         while (box = boxes.iterateNext()) {
  14948.             var title = Zotero.Utilities.trimInternal(doc.evaluate(''.//span[@class="txtBoldOnly"]'', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  14949.             var link = doc.evaluate(''.//a[@class="outwardLink"]'', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  14950.             items[link] = title;
  14951.         }
  14952.         items = Zotero.selectItems(items);
  14953.         for (var i in items) {
  14954.             articles.push(returnURL(getEID(i)));
  14955.         }
  14956.     } else {
  14957.         articles = [returnURL(getEID(url))];
  14958.     }
  14959.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  14960.         var eid = getEID(newDoc.location.href);
  14961.         var stateKey = newDoc.evaluate(''//input[@name="stateKey"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  14962.         var get = ''http://www.scopus.com/scopus/citation/export.url'';
  14963.         var post = ''origin=recordpage&sid=&src=s&stateKey='' + stateKey + ''&eid='' + eid + ''&sort=&exportFormat=RIS&view=CiteAbsKeyws&selectedCitationInformationItemsAll=on'';
  14964.         Zotero.Utilities.HTTP.doPost(get, post, function(text) {
  14965.             // load translator for RIS
  14966.             var translator = Zotero.loadTranslator("import");
  14967.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  14968.             translator.setString(text);
  14969.             translator.setHandler("itemDone", function(obj, item) {
  14970.                 if (item.notes[0][''note'']) {
  14971.                     item.abstractNote = item.notes[0][''note''];
  14972.                     item.notes = new Array();
  14973.                     item.complete();
  14974.                 }
  14975.             });
  14976.             translator.translate();
  14977.         });
  14978.     }, function() {Zotero.done;});
  14979.     Zotero.wait();
  14980. }');
  14981.  
  14982. REPLACE INTO translators VALUES ('e1140aa1-3bcf-4226-9099-78ef0b63bb3e', '1.0.0b4.r5', '', '2008-03-19 16:00:00', '0', '100', '4', 'Osterreichischer Bibliothekenverbund', 'Michael Berkowitz', 'http://meteor.bibvb.ac.at/F', 
  14983. 'function detectWeb(doc, url) {
  14984.     if (doc.evaluate(''//td[@class="bar"]/a[@class="blue"]/img'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  14985.         return "book";
  14986.     } else if (doc.title.indexOf("Ergebnisliste") != -1) {
  14987.         return "multiple";
  14988.     }
  14989. }', 
  14990. 'function doWeb(doc, url) {
  14991.     var arts = new Array();
  14992.     if (detectWeb(doc, url) == "multiple") {
  14993.         var itemRegexp = ''^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct)''
  14994.         var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp, ''^[0-9]+$'');
  14995.         items = Zotero.selectItems(items);
  14996.         for (var i in items) {
  14997.             arts.push(i);
  14998.         } 
  14999.     } else {
  15000.         arts = [url];
  15001.     }
  15002.     Zotero.Utilities.processDocuments(arts, function(newDoc) {
  15003.         var link = newDoc.evaluate(''//td[@class="bar"]/a[@class="blue"][2]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15004.         link = link.replace(/full\-mail[^&]+&/, "full-mail&") + "&option_type=&format=777&encoding=UTF_TO_WEB_MAIL+++++&SUBJECT=&NAME=&EMAIL=&x=17&y=7";
  15005.         Zotero.Utilities.loadDocument([link], function(newDoc2) {
  15006.             var newest = newDoc2.evaluate(''/html/body/p[@class="text3"]/a'', newDoc2, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15007.             Zotero.Utilities.HTTP.doGet(newest, function(text) {
  15008.                 var translator = Zotero.loadTranslator("import");
  15009.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15010.                 translator.setString(text);
  15011.                 translator.setHandler("itemDone", function(obj, item) {
  15012.                     item.itemType = "book";
  15013.                     item.complete();
  15014.                 });
  15015.                 translator.translate();
  15016.             });
  15017.         });
  15018.     }, function() {Zotero.done;});
  15019.     Zotero.wait();
  15020. }');
  15021.  
  15022. REPLACE INTO translators VALUES ('4654c76f-451c-4ae6-9a36-575e982b3cdb', '1.0.0b4.r5', '', '2008-03-14 19:10:00', '0', '100', '4', 'Investigative Ophthalmology and Visual Science', 'Michael Berkowitz', 'http://www.iovs.org/', 
  15023. 'function detectWeb(doc, url) {
  15024.     if (doc.title.indexOf("Table of Contents") != -1 || doc.title.indexOf("Search Result") != -1) {
  15025.         return "multiple"
  15026.     } else if (url.indexOf("abstract") != -1 || url.indexOf("full") != -1) {
  15027.         return "journalArticle";
  15028.     }
  15029. }', 
  15030. 'function doWeb(doc, url) {
  15031.     var host = doc.location.host;
  15032.     var arts = new Array();
  15033.     if (detectWeb(doc, url) == "multiple") {
  15034.         var items = new Object();
  15035.         if (doc.title.indexOf("Search Result") != -1) {
  15036.             var boxes = doc.evaluate(''//table/tbody/tr/td/font/table/tbody/tr[1]'', doc, null, XPathResult.ANY_TYPE, null);
  15037.             var box;
  15038.             while (box = boxes.iterateNext()) {
  15039.                 var id = doc.evaluate(''.//input'', box, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  15040.                 var titles = doc.evaluate(''./td/font/strong'', box, null, XPathResult.ANY_TYPE, null);
  15041.                 var titletext = '''';
  15042.                 var title;
  15043.                 while (title = titles.iterateNext()) {
  15044.                     titletext += title.textContent;
  15045.                 }
  15046.                 items[id] = titletext;
  15047.             }
  15048.         } else if (doc.title.indexOf("Table of Content") != -1) {
  15049.             var ids = doc.evaluate(''/html/body/form/dl/dt/input'', doc, null, XPathResult.ANY_TYPE, null);
  15050.             var titles = doc.evaluate(''/html/body/form/dl/dd/strong'', doc, null, XPathResult.ANY_TYPE, null);
  15051.             var id;
  15052.             var title;
  15053.             while ((title = titles.iterateNext()) && (id = ids.iterateNext())) {
  15054.                 items[''iovs;'' + id.value] = title.textContent;
  15055.             }
  15056.         }
  15057.         items = Zotero.selectItems(items);
  15058.         for (var i in items) {
  15059.             arts.push(i);
  15060.         }
  15061.     } else {
  15062.         arts = [doc.evaluate(''//a[contains(@href, "citmgr")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/=(.*)$/)[1]]
  15063.     }
  15064.     Zotero.debug(arts);
  15065.     for each (var id in arts) {
  15066.         var post = ''type=refman&gca='' + id;
  15067.         Zotero.debug(post);
  15068.         post = ''http://www.iovs.org/cgi/citmgr?'' + post;
  15069.         Zotero.debug(post);
  15070.         Zotero.Utilities.HTTP.doGet(post, function(text) {
  15071.             Zotero.debug(text);
  15072.             var translator = Zotero.loadTranslator("import");
  15073.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15074.             translator.setString(text);
  15075.             translator.setHandler("itemDone", function(obj, item) {
  15076.                 var pdfurl = item.url.replace(/content\/[^/]+/, "reprint") + ".pdf";
  15077.                 item.attachments = [
  15078.                     {url:item.url, title:"IOVS Snapshot", mimeType:"text/html"},
  15079.                     {url:pdfurl, tite:"IOVS Full Text PDF", mimeType:"application/pdf"}
  15080.                 ];
  15081.                 if (item.notes[0][''note''].match(/\d/)) {
  15082.                     item.DOI = item.notes[0][''note''];
  15083.                     item.notes = new Array();
  15084.                 }
  15085.                 item.complete();
  15086.             });
  15087.             translator.translate();
  15088.             
  15089.             Zotero.done();        
  15090.         });
  15091.     }
  15092. }');
  15093.  
  15094. REPLACE INTO translators VALUES ('62c0e36a-ee2f-4aa0-b111-5e2cbd7bb5ba', '1.0.0b4.r5', '', '2008-03-13 22:30:00', '0', '100', '4', 'MetaPress', 'Michael Berkowitz', 'https?://(.*).metapress.com/', 
  15095. 'function detectWeb(doc, url) {
  15096.     if (doc.title.indexOf("Search Results") != -1) {
  15097.         return "multiple";
  15098.     } else if (url.match(/content\/[^?/]/)) {
  15099.         return "journalArticle";
  15100.     }
  15101. }', 
  15102. 'function doWeb(doc, url) {
  15103.     var host = doc.location.host;
  15104.     var artids = new Array();
  15105.     if (detectWeb(doc, url) == "multiple") {
  15106.         
  15107.     } else {
  15108.         artids.push(url.match(/content\/([^/]+)/)[1]);
  15109.     }
  15110.     for (var i in artids) {
  15111.         var newurl = ''http://'' + host + ''/content/'' + artids[i];
  15112.         Zotero.Utilities.processDocuments([newurl], function(newDoc) {
  15113.             var tagsx = ''//td[@class="mainPageContent"]/div[3]'';
  15114.             if (doc.evaluate(tagsx, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15115.                 var tags = Zotero.Utilities.trimInternal(doc.evaluate(tagsx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(",");
  15116.             }
  15117.             Zotero.Utilities.HTTP.doPost(''http://'' + host + ''/export.mpx'', ''code='' + artids[i] + ''&mode=ris'', function(text) {
  15118.                 // load translator for RIS
  15119.                 var translator = Zotero.loadTranslator("import");
  15120.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15121.                 translator.setString(text);
  15122.                 translator.setHandler("itemDone", function(obj, item) {
  15123.                     var pdfurl = ''http://'' + host + ''/content/'' + artids[i] + ''/fulltext.pdf'';
  15124.                     item.attachments = [
  15125.                         {url:item.url, title:"MetaPress Snapshot", mimeType:"text/html"},
  15126.                         {url:pdfurl, title:"MetaPress Full Text PDF", mimeType:"application/pdf"}
  15127.                     ];
  15128.                     if (tags) item.tags = tags;
  15129.                     if (item.abstractNote.substr(0, 8) == "Abstract") item.abstractNote = Zotero.Utilities.trimInternal(item.abstractNote.substr(8));
  15130.                     item.complete();
  15131.                 });
  15132.                 translator.translate();
  15133.                 Zotero.done();
  15134.             });
  15135.         }, function() {});
  15136.     }
  15137. }');
  15138.  
  15139. REPLACE INTO translators VALUES ('0b356cb6-7fa1-4662-b6e8-7ffc9ca2cd4a', '1.0.0b4.r5', '', '2008-04-23 09:45:00', '0', '100', '4', 'Progress of Theoretical Physics', 'Michael Berkowitz', 'http://ptp.ipap.jp/', 
  15140. 'function detectWeb(doc, url) {
  15141.     if (doc.title.match(/search result/) || doc.title.match(/Table of Contents/)) {
  15142.         return "multiple";
  15143.     } else if (url.match(/getarticle\?/)) {
  15144.         return "journalArticle";
  15145.     }
  15146. }', 
  15147. 'function doWeb(doc, url) {
  15148.     var arts = new Array();
  15149.     if (detectWeb(doc, url) == "multiple") {
  15150.         var items = new Object();
  15151.         if (doc.title.toLowerCase().match(/search result/)) {
  15152.             var titles = doc.evaluate(''/html/body//li//b'', doc, null, XPathResult.ANY_TYPE, null);
  15153.             var links = doc.evaluate(''/html/body//li/a'', doc, null, XPathResult.ANY_TYPE, null);
  15154.             var title;
  15155.             var link;
  15156.             while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  15157.                 items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  15158.             }
  15159.         } else if (doc.title.toLowerCase().match(/table of contents/)) {
  15160.             var xpath = doc.evaluate(''/html/body/ul/li/a'', doc, null, XPathResult.ANY_TYPE, null);
  15161.             var text;
  15162.             while (text = xpath.iterateNext()) {
  15163.                 items[text.href] = Zotero.Utilities.trimInternal(text.textContent);
  15164.             }
  15165.         }
  15166.         items = Zotero.selectItems(items);
  15167.         for (var i in items) {
  15168.             arts.push(i);
  15169.         }
  15170.     } else {
  15171.         arts = [url];
  15172.     }
  15173.     Zotero.Utilities.processDocuments(arts, function(doc) {
  15174.         var item = new Zotero.Item("journalArticle");
  15175.         item.ISSN = ''0033-068X'';
  15176.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//h2[@class="title"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15177.         if (doc.evaluate(''//h2[@class="subtitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15178.             item.title = item.title + ": " + Zotero.Utilities.trimInternal(doc.evaluate(''//h2[@class="subtitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15179.         }
  15180.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@class="abstract"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15181.         var authors = Zotero.Utilities.unescapeHTML(Zotero.Utilities.trimInternal(doc.evaluate(''/html/body/p[@class="author"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent));
  15182.         authors = authors.replace(/[*()]+/g, "").split(/(,\s+|\band\b)/);
  15183.         for each (var aut in authors) {
  15184.             if (!aut.match(/(,|and)/)) {
  15185.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  15186.             }
  15187.         }
  15188.         var info = Zotero.Utilities.trimInternal(doc.evaluate(''//h4[@class="info"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15189.         info = info.match(/Vol\.\s+(\d+)\s+No\.\s+(\d+)\s+\((\d+)\)\s+pp\.\s+([\d-]+)\s+URL\s+:\s+(.*)\s+DOI\s+:\s+(.*)$/);
  15190.         item.volume = info[1];
  15191.         item.issue = info[2];
  15192.         item.date = info[3];
  15193.         item.pages = info[4];
  15194.         item.url = info[5];
  15195.         item.DOI = info[6];
  15196.         var pdfurl = doc.evaluate(''//a[contains(text(), "PDF")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15197.         item.attachments = [
  15198.             {url:item.url, title:"PTP Snapshot", mimeType:"text/html"},
  15199.             {url:pdfurl, title:"PTP Full Text PDF", mimeType:"application/pdf"}
  15200.         ];
  15201.         item.complete();
  15202.     }, function() {Zotero.done;});
  15203.     Zotero.wait();
  15204. }');
  15205.  
  15206. REPLACE INTO translators VALUES ('0863b8ec-e717-4b6d-9e35-0b2db2ac6b0f', '1.0.0b4.r5', '', '2008-04-23 09:45:00', '0', '100', '4', 'Institute of Pure and Applied Physics', 'Michael Berkowitz', 'http://(jjap|apex|jpsj)\.ipap\.jp/', 
  15207. 'function detectWeb(doc, url) {
  15208.     if (doc.title.indexOf("Table of Contents") != -1 || doc.title.indexOf("search result") != -1) {
  15209.         return "multiple";
  15210.     } else if (url.indexOf("link?") != -1) {
  15211.         return "journalArticle";
  15212.     }
  15213. }', 
  15214. 'var journalNames = {
  15215.     jpsj:["Journal of the Physical Society of Japan", "0031-9015"],
  15216.     jjap:["Japanese Journal of Applied Physics", "0021-4922"],
  15217.     apex:["Applied Physics Express", "1882-0778"]
  15218. }
  15219.  
  15220. function doWeb(doc, url) {
  15221.     var arts = new Array();
  15222.     if (detectWeb(doc, url) == "multiple") {
  15223.         var items = new Object();
  15224.         if (doc.title.toLowerCase().indexOf("table of contents") != -1) {
  15225.             if (url.match(/apex/)) {
  15226.                 var titlesx = ''//div[@id="contents"]/dl/dt'';
  15227.                 var linksx = ''//div[@id="contents"]/dl/dd/a[1]'';
  15228.             } else if (url.match(/jjap/)) {
  15229.                 var xpath = ''/html/body/dt/a'';
  15230.             } else if (url.match(/jpsj/)) {
  15231.                 var xpath = ''/html/body/dl/dt/a[contains(@href, "link")]'';
  15232.             }
  15233.         } else if (doc.title.toLowerCase().indexOf("search result") != -1) {
  15234.             var linksx = ''/html/body//li/a'';
  15235.             var titlesx = ''/html/body//li//b'';
  15236.         }
  15237.         if (xpath) {
  15238.             var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  15239.             var title;
  15240.             while (title = titles.iterateNext()) {
  15241.                 items[title.href] = Zotero.Utilities.trimInternal(title.textContent);
  15242.             }
  15243.         } else {
  15244.             var titles = doc.evaluate(titlesx, doc, null, XPathResult.ANY_TYPE, null);
  15245.             var links = doc.evaluate(linksx, doc, null, XPathResult.ANY_TYPE, null);
  15246.             var title;
  15247.             var link;
  15248.             while ((title = titles.iterateNext()) && (link = links.iterateNext())) {
  15249.                 items[link.href] = Zotero.Utilities.trimInternal(title.textContent);
  15250.             }
  15251.         }
  15252.         items = Zotero.selectItems(items);
  15253.         for (var i in items) {
  15254.             arts.push(i);
  15255.         }
  15256.     } else {
  15257.         arts = [url];
  15258.     }
  15259.     Zotero.Utilities.processDocuments(arts, function(doc) {
  15260.         var item = new Zotero.Item("journalArticle");
  15261.         item.url = doc.location.href;
  15262.         var jour = item.url.match(/http:\/\/([^.]+)\./)[1];
  15263.         item.publicationTitle = journalNames[jour][0];
  15264.         item.ISSN = journalNames[jour][1];
  15265.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//h2[@class="title"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15266.         var authors = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@class="author"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15267.         authors = authors.replace(/\d+/g, "");
  15268.         authors = authors.split(/,\s+(and)?\s*/);
  15269.         for each (var aut in authors) {
  15270.             if ((aut != "") && (aut != "and")) {
  15271.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  15272.             }
  15273.         }
  15274.  
  15275.         //get info
  15276.         var infos = doc.evaluate(''//p[@class="info"]'', doc, null, XPathResult.ANY_TYPE, null);
  15277.         var voliss = infos.iterateNext().textContent;
  15278.         var keys = infos.iterateNext().textContent;
  15279.         if (voliss.match(/([^\d]+)(\d+)\s+\((\d+)\)\s+([\d\-]+)/)) {
  15280.             voliss = voliss.match(/([^\d]+)(\d+)\s+\((\d+)\)\s+([\d\-]+)/);
  15281.             var x = 4
  15282.         } else {
  15283.             voliss = voliss.match(/([^\d]+)(\d+)\s+\((\d+)\)\s+(pp\.)?\s+([\d\-]+)/);
  15284.             var x = 5
  15285.         }
  15286.         item.journalAbbreviation = Zotero.Utilities.trimInternal(voliss[1]);
  15287.         item.volume = voliss[2];
  15288.         item.date = voliss[3];
  15289.         item.pages = voliss[x];        
  15290.         
  15291.         keys = Zotero.Utilities.trimInternal(keys);
  15292.  
  15293.         if (keys.match(/KEYWORDS/)) {
  15294.             keys = keys.match(/KEYWORDS:\s+(.*)URL:\s+(.*)DOI:\s+(.*)$/);
  15295.             var a = 1;
  15296.             var c = 3;
  15297.         } else {
  15298.             keys = keys.match(/URL:\s+(.*)DOI:\s+(.*)$/);
  15299.             var c = 2;
  15300.         }
  15301.         if (a) {
  15302.             item.tags = keys[a].split(/,\s+/);
  15303.         }
  15304.         item.DOI = keys[c];
  15305.         item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//p[@class="abstract"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  15306.         item.complete();
  15307.         var pdfurl = doc.evaluate(''//a[contains(text(), "PDF")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15308.         item.attachments = [
  15309.             {url:item.url, title:"IPAP Snapshot", mimeType:"text/html"}
  15310.         ];
  15311.     }, function() {Zotero.done;});
  15312.     Zotero.wait();
  15313. }');
  15314.  
  15315. REPLACE INTO translators VALUES ('9e306d5d-193f-44ae-9dd6-ace63bf47689', '1.0.0b3r1', '', '2008-07-02 11:00:00', '1', '100', '4', 'IngentaConnect', 'Michael Berkowitz', 'http://(www.)?ingentaconnect.com', 
  15316. 'function detectWeb(doc, url) {
  15317.     if (url.indexOf("article?") != -1 || url.indexOf("article;") != -1 || url.indexOf("/art") != -1) {
  15318.         return "journalArticle";
  15319.     } else if (url.indexOf("search?") !=-1 || url.indexOf("search;") != -1) {
  15320.         return "multiple";
  15321.     }
  15322. }', 
  15323. 'function doWeb(doc, url) {
  15324.     var articles = new Array();
  15325.     if (detectWeb(doc, url) == "multiple") {
  15326.         var items = new Object();
  15327.         var artlink = ''//div//p/strong/a'';
  15328.         var links = doc.evaluate(artlink, doc, null, XPathResult.ANY_TYPE, null);
  15329.         var next_link;
  15330.         while (next_link = links.iterateNext()) {
  15331.             items[next_link.href] = next_link.textContent;
  15332.         }
  15333.         items = Zotero.selectItems(items);
  15334.         for (var i in items) {
  15335.             articles.push(i);
  15336.         }
  15337.     } else {
  15338.         articles = [url];
  15339.     }
  15340.     Zotero.debug(articles);
  15341.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  15342.         var risurl = newDoc.evaluate(''//div[@id="export-formats"]/ul/li/a[@title="EndNote Export"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15343.         if (newDoc.evaluate(''//div[@id="abstract"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) var abs = Zotero.Utilities.trimInternal(newDoc.evaluate(''//div[@id="abstract"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10);
  15344.         if (newDoc.evaluate(''//div[@id="info"]/p[1]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15345.             var keywords = newDoc.evaluate(''//div[@id="info"]/p[1]/a'', newDoc, null, XPathResult.ANY_TYPE, null);
  15346.             var key;
  15347.             var keys = new Array();
  15348.             while (key = keywords.iterateNext()) {
  15349.                 keys.push(Zotero.Utilities.capitalizeTitle(key.textContent));
  15350.             }
  15351.         }
  15352.         Zotero.Utilities.HTTP.doGet(risurl, function(text) {
  15353.             text = text.replace(/(PY\s+\-\s+)\/+/, "$1");
  15354.             text = text.replace(/ER\s\s\-/, "") + "\nER  - ";
  15355.             var translator = Zotero.loadTranslator("import");
  15356.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15357.             translator.setString(text);
  15358.             translator.setHandler("itemDone", function(obj, item) {
  15359.                 if (abs) item.abstractNote = abs;
  15360.                 item.attachments = [{url:item.url, title:"IngentaConnect Snapshot", mimeType:"text/html"}];
  15361.                 if (keys) item.tags = keys;
  15362.                 if (item.DOI) {
  15363.                     if (item.DOI.match(/doi/)) {
  15364.                         item.DOI = item.DOI.substr(4);
  15365.                     }
  15366.                 }
  15367.                 item.complete();
  15368.             });
  15369.             translator.translate();
  15370.         });
  15371.     }, function() {Zotero.done;});
  15372. }');
  15373.  
  15374.  
  15375. REPLACE INTO translators VALUES ('636c8ea6-2af7-4488-8ccd-ea280e4a7a98', '1.0.0b4.r5', '', '2009-01-28 18:10:00', 1, 100, 4, 'Sage Journals Online', 'Michael Berkowitz', 'http://[^/]*\.sagepub\.com[^/]*/',
  15376. 'function detectWeb(doc, url) {
  15377.     if (url.indexOf("searchresults") != -1 || (doc.title.indexOf("Table of Contents") != -1)) {
  15378.         return "multiple";
  15379.     } else if (url.indexOf("cgi/content") != -1) {
  15380.         return "journalArticle";
  15381.     }
  15382. }',
  15383. 'function doWeb(doc, url) {
  15384.     var arts = new Array();
  15385.     if (detectWeb(doc, url) == "multiple") {
  15386.         var items = new Object();
  15387.         if (doc.title.indexOf("Table of Contents") != -1) {
  15388.             var searchx = ''//div[@id="maincontent"]/div[@class="contentarea"]/table[@class="toc"]/tbody/tr/td[2][@class="rightcol"]/form/dl/dd''; 
  15389.             var titlex = ''.//strong'';
  15390.         } else {
  15391.             var searchx = ''//form[@id="search_results"]/div[@class="resultsitem"]/div[2]'';
  15392.             var titlex = ''.//label'';
  15393.             
  15394.         }    
  15395.         var linkx = ''.//a[contains(@href, "abstract")]'';
  15396.         var searchres = doc.evaluate(searchx, doc, null, XPathResult.ANY_TYPE, null);
  15397.         var next_res;
  15398.         while (next_res = searchres.iterateNext()) {
  15399.             var title = doc.evaluate(titlex, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  15400.             // sometimes there is no abstract, the search results returns an entire journal, I am skipping it silently
  15401.             var link = doc.evaluate(linkx, next_res, null, XPathResult.ANY_TYPE, null).iterateNext();
  15402.             if (link) {
  15403.                 items[link.href] = title;
  15404.             }
  15405.         }
  15406.         items = Zotero.selectItems(items);
  15407.         for (var i in items) {
  15408.             arts.push(i);
  15409.         } 
  15410.     } else {
  15411.         arts = [url];
  15412.     }
  15413.     var newurls = new Array();
  15414.     for each (var i in arts) {
  15415.         newurls.push(i);
  15416.     }
  15417.     Zotero.Utilities.HTTP.doGet(arts, function(text) {
  15418.         var id = text.match(/=([^=]+)\">\s*Add to Saved Citations/)[1];
  15419.         var newurl = newurls.shift();
  15420.         var pdfurl = newurl.replace(/content\/[^/]+/, "reprint") + ".pdf";
  15421.         if (pdfurl.indexOf("?") != -1) {
  15422.             pdfurl = pdfurl.substring(0,pdfurl.indexOf("?")) + ".pdf";
  15423.         }
  15424.         Zotero.debug("pdf= "+pdfurl);
  15425.         var get = ''http://online.sagepub.com/cgi/citmgr?type=refman&gca='' + id;
  15426.         Zotero.Utilities.HTTP.doGet(get, function(text) {
  15427.             var translator = Zotero.loadTranslator("import");
  15428.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15429.             translator.setString(text);
  15430.             if (text.match(/N1(.*)\n/)) {
  15431.                 var doi = text.match(/N1\s+\-\s+(.*)\n/)[1];
  15432.             }
  15433.             translator.setHandler("itemDone", function(obj, item) {
  15434.                 item.attachments = [
  15435.                     {url:newurl, title:"Sage Journals Snapshot", mimeType:"text/html"},
  15436.                     {url:pdfurl, title:"Sage Journals Full Text PDF", mimeType:"application/pdf"}
  15437.                 ];
  15438.                 if (doi) item.DOI = doi;
  15439.                 if (item.notes) item.notes = [];
  15440.                 item.complete();
  15441.             });
  15442.             translator.translate();
  15443.         });
  15444.     });
  15445.     Zotero.wait();
  15446. }');
  15447.  
  15448. REPLACE INTO translators VALUES ('3eabecf9-663a-4774-a3e6-0790d2732eed', '1.0.0b4.r5', '', '2008-05-30 08:00:00', '1', '100', '4', 'SciELO', 'Michael Berkowitz', 'http://(www.)?scielo.(org|br)/', 
  15449. 'function detectWeb(doc, url) {
  15450.     if (url.indexOf("wxis.exe") != -1) {
  15451.         if (doc.evaluate(''//*[@class="isoref"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15452.             return "multiple";
  15453.         }
  15454.     } else if (url.indexOf("issuetoc") != -1) {
  15455.         return "multiple"
  15456.     } else if (url.indexOf("&pid=") != -1) {
  15457.         return "journalArticle";
  15458.     } else {
  15459.         Zotero.debug("ok");
  15460.     }
  15461. }', 
  15462. 'function makeURL(host, str) {
  15463.     return ''http://www.scielo.br/scieloOrg/php/articleXML.php?pid='' + str.match(/pid=([^&]+)/)[1];
  15464. }
  15465.  
  15466. function doWeb(doc, url) {
  15467.     var host = doc.location.host;
  15468.     var arts = new Array();
  15469.     if (detectWeb(doc, url) == "multiple") {
  15470.         var items = new Object();
  15471.         if (url.indexOf(".exe") != -1) {
  15472.             var titlepath = ''//font[@class="isoref"]/font[@class="negrito"]'';
  15473.             var linkpath = ''//font[@class="isoref"]/a[@class="isoref"]'';
  15474.         } else {
  15475.             var titlepath = ''//font[@class="normal"]/b/b[1]'';
  15476.             var linkpath = ''//tr/td/div/a[1]'';
  15477.         }
  15478.         var titles = doc.evaluate(titlepath, doc, null, XPathResult.ANY_TYPE, null);
  15479.         var links = doc.evaluate(linkpath, doc, null, XPathResult.ANY_TYPE, null);
  15480.         var next_title;
  15481.         var next_link;
  15482.         while ((next_title = titles.iterateNext()) && (next_link = links.iterateNext())) {
  15483.             items[next_link.href] = next_title.textContent;
  15484.         }
  15485.         items = Zotero.selectItems(items);
  15486.         for (var i in items) {
  15487.             arts.push(makeURL(host, i));
  15488.         }
  15489.     } else {
  15490.         arts = [makeURL(host, url)];
  15491.     }
  15492.     Zotero.Utilities.HTTP.doGet(arts, function(text) {
  15493.         var item = new Zotero.Item("journalArticle");
  15494.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "").replace(/<self-uri.*\/self\-uri>/g, "");
  15495.         var journal = text.split("<journal-meta>")[1].split("</journal-meta>")[0];
  15496.         journal = "<journal>" + journal + "</journal>";
  15497.         journal = journal.replace(/\-([a-z])/g, "$1");
  15498.         var xml2 = new XML(journal);
  15499.         var art = text.split("<article-meta>")[1].split("</article-meta>")[0];
  15500.         art = "<article>" + art + "</article>";
  15501.         art = art.replace(/\-([a-z])/g, "$1");
  15502.         var xml3 = new XML(art);
  15503.         
  15504.         item.publicationTitle = xml2..journaltitle.text().toString();
  15505.         item.journalAbbreviation = xml2..abbrevjournaltitle.text().toString();
  15506.         item.ISSN = xml2..issn.text().toString();
  15507.         item.publisher = xml2..publisher..publishername.text().toString();
  15508.         item.title = xml3..titlegroup..articletitle.text().toString();
  15509.         for (var i = 0 ; i < xml3..contribgroup..contrib.length() ; i++) {
  15510.             var name = xml3..contribgroup..contrib[i]..name;
  15511.             item.creators.push({firstName:name..givennames.text().toString(), lastName:name..surname.text().toString(), creatorType:"author"});
  15512.         }
  15513.         
  15514.         var date = xml3..pubdate[0];
  15515.         var day = date..day.text().toString();
  15516.         var month = date..month.text().toString();
  15517.         var year = date..year.text().toString();
  15518.         
  15519.         date =  year;
  15520.         if (month != "00") {
  15521.             date = month + "/" + date;
  15522.         }
  15523.         if (day != "00") {
  15524.             date = day + "/" + date;
  15525.         }
  15526.         item.date = date;
  15527.         item.volume = xml3..volume.text().toString();
  15528.         item.pages = xml3..fpage.text().toString() + "-" + xml3..lpage.text().toString();
  15529.         
  15530.         for (var i = 0 ; i < xml3..kwdgroup..kwd.length() ; i++) {
  15531.             item.tags.push(xml3..kwdgroup..kwd[i].text().toString());
  15532.         }
  15533.         
  15534.         item.attachments = [
  15535.             {url:url, title:"SciELO Snapshot", mimeType:"text/html"}
  15536.         ];
  15537.  
  15538.         item.complete();
  15539.     });
  15540. }');
  15541.  
  15542. REPLACE INTO translators VALUES ('0a84a653-79ea-4c6a-8a68-da933e3b504a', '1.0.0b4.r5', '', '2008-03-28 16:30:00', '0', '100', '4', 'Alexander Street Press', 'John West and Michael Berkowitz', 'http://(?:www\.)alexanderstreet', 
  15543. 'function detectWeb(doc, url) {
  15544.     if( url.indexOf("object.details.aspx") != -1 ) {
  15545.         var zitemtype = doc.getElementById("ctl00_ctl00_MasterContentBody_ContentPlaceHolder1_txtZType").value;
  15546.         switch (zitemtype.toLowerCase()) {
  15547.                 case "book":
  15548.                     return "book";
  15549.                     break;
  15550.                 case "chapter":
  15551.                     return "bookSection";
  15552.                     break;
  15553.                 case "journal":
  15554.                     return "journalArticle";
  15555.                     break;
  15556.                 case "manuscript":
  15557.                     return "manuscript";
  15558.                     break;
  15559.                 case "audio":
  15560.                     return "audioRecording";
  15561.                     break;
  15562.                 case "video":
  15563.                     return "videoRecording";
  15564.                     break;
  15565.                 case "issue":
  15566.                     return "journalArticle";
  15567.                     break;
  15568.                 case "article":
  15569.                     return "journalArticle";
  15570.                     break;
  15571.                 case "series":
  15572.                     return "interview";
  15573.                     break;
  15574.                 case "session":
  15575.                     return "interview";
  15576.                     break;
  15577.                 default:
  15578.                     return "document";
  15579.         }
  15580.     } else if (url.indexOf("results.aspx") != -1) {
  15581.         return "multiple";
  15582.     }
  15583. }', 
  15584. 'function scrape(doc, url) {
  15585.     // set prefix for serverside control
  15586.     var p = "ctl00_ctl00_MasterContentBody_ContentPlaceHolder1_txtZ";
  15587.  
  15588.     // get values from hidden inputs
  15589.     var ztype = GetItemType(doc.getElementById(p+"Type").value);
  15590.     var ztitle = doc.getElementById(p+"Title").value;
  15591.     var zbooktitle = doc.getElementById(p+"BookTitle").value;
  15592.     var znotes = doc.getElementById(p+"Notes").value;
  15593.     var zurl = doc.getElementById(p+"URL").value;
  15594.     var zrights = doc.getElementById(p+"Rights").value;
  15595.     var zseries = doc.getElementById(p+"Series").value;
  15596.     var zvolume = doc.getElementById(p+"Volume").value;
  15597.     var zissue = doc.getElementById(p+"Issue").value;
  15598.     var zedition = doc.getElementById(p+"Edition").value;
  15599.     var zplace = doc.getElementById(p+"Place").value;
  15600.     var zpublisher = doc.getElementById(p+"Publisher").value;
  15601.     var zpages = doc.getElementById(p+"Pages").value;
  15602.     var zrepository = doc.getElementById(p+"Repository").value;
  15603.     var zlabel = doc.getElementById(p+"Label").value;
  15604.     var zrunningTime = doc.getElementById(p+"RunningTime").value;
  15605.     var zlanguage = doc.getElementById(p+"Language").value;
  15606.     var zauthor = doc.getElementById(p+"Author").value;
  15607.     var zeditor = doc.getElementById(p+"Editor").value;
  15608.     var ztranslator = doc.getElementById(p+"Translator").value;
  15609.     var zinterviewee = doc.getElementById(p+"Interviewee").value;
  15610.     var zinterviewer = doc.getElementById(p+"Interviewer").value;
  15611.     var zrecipient = doc.getElementById(p+"Recipient").value;
  15612.     var zdirector = doc.getElementById(p+"Director").value;
  15613.     var zscriptwriter = doc.getElementById(p+"ScriptWriter").value;
  15614.     var zproducer = doc.getElementById(p+"Producer").value;
  15615.     var zcastMember = doc.getElementById(p+"CastMember").value;
  15616.     var zperformer = doc.getElementById(p+"Performer").value;
  15617.     var zcomposer = doc.getElementById(p+"Composer").value;
  15618.  
  15619.     // create Zotero item
  15620.     var newArticle = new Zotero.Item(ztype);
  15621.  
  15622.     // populate Zotero item
  15623.     newArticle.title = ztitle;
  15624.     newArticle.bookTitle = zbooktitle;
  15625.     newArticle.notes = znotes;
  15626.     newArticle.url = zurl;
  15627.     newArticle.place = zplace;
  15628.     newArticle.publisher = zpublisher;
  15629.     newArticle.pages = zpages;
  15630.     newArticle.rights = zrights;
  15631.     newArticle.series = zseries;
  15632.     newArticle.volume = zvolume;
  15633.     newArticle.issue = zissue;
  15634.     newArticle.edition = zedition;
  15635.     newArticle.repository = zrepository;
  15636.     newArticle.label = zlabel;
  15637.     newArticle.runningTime = zrunningTime;
  15638.     newArticle.language = zlanguage;
  15639.     newArticle.editor = zeditor;
  15640.     newArticle.translator = ztranslator;
  15641.     newArticle.interviewee = zinterviewee;
  15642.     newArticle.interviewer = zinterviewer;
  15643.     newArticle.recipient = zrecipient;
  15644.     newArticle.director = zdirector;
  15645.     newArticle.scriptwriter = zscriptwriter;
  15646.     newArticle.producer = zproducer;
  15647.     newArticle.castMember = zcastMember;
  15648.     newArticle.performer = zperformer;
  15649.     newArticle.composer = zcomposer;
  15650.     var aus = zauthor.split(";");
  15651.     for (var i=0; i< aus.length ; i++) {
  15652.          newArticle.creators.push(Zotero.Utilities.cleanAuthor(aus[i], "author", true));
  15653.     }
  15654.  
  15655.     newArticle.attachments = [{url:doc.location.href, title:"Alexander Street Press Snapshot", mimeType:"text/html"}];
  15656.     if (doc.evaluate(''//a[contains(@href, "get.pdf")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15657.         var pdfurl = doc.evaluate(''//a[contains(@href, "get.pdf")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15658.         newArticle.attachments.push({url:pdfurl, title:"Alexander Street Press PDF", mimeType:"application/pdf"});
  15659.     } else if (doc.evaluate(''//a[contains(@href, "get.jpg")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15660.         var imgurl = doc.evaluate(''//a[contains(@href, "get.jpg")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace(/.{2}$/, "01");
  15661.         newArticle.attachments.push({url:imgurl, title:"Alexander Street Press Pg 1", mimeType:"image/jpg"});
  15662.         newArticle.notes = [{note:"Further page images can be found by following the URL of the ''Alexander Street Press Pg 1'' attachment and iterating the final digits of the URL"}];
  15663.     }
  15664.     // save Zotero item
  15665.     newArticle.complete();
  15666.  
  15667. }
  15668.  
  15669. function GetItemType(zitemtype) {
  15670.     switch (zitemtype.toLowerCase()) {
  15671.             case "book":
  15672.                 return "book";
  15673.                 break;
  15674.             case "chapter":
  15675.                 return "bookSection";
  15676.                 break;
  15677.             case "journal":
  15678.                 return "journalArticle";
  15679.                 break;
  15680.             case "manuscript":
  15681.                 return "manuscript";
  15682.                 break;
  15683.             case "audio":
  15684.                 return "audioRecording";
  15685.                 break;
  15686.             case "video":
  15687.                 return "videoRecording";
  15688.                 break;
  15689.             case "issue":
  15690.                 return "journalArticle";
  15691.                 break;
  15692.             case "article":
  15693.                 return "journalArticle";
  15694.                 break;
  15695.             case "series":
  15696.                 return "interview";
  15697.                 break;
  15698.             case "session":
  15699.                 return "interview";
  15700.                 break;
  15701.             default:
  15702.                 return "document";
  15703.        }
  15704. }
  15705.  
  15706. function doWeb(doc, url) {
  15707.     var articles = new Array();
  15708.     if (detectWeb(doc, url) == "multiple") {
  15709.         var items = new Object();
  15710.         var xpath = ''//tbody/tr/td[2][@class="data"]/a[1]'';
  15711.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  15712.         var next_title;
  15713.         while (next_title = titles.iterateNext()) {
  15714.             items[next_title.href] = next_title.textContent;
  15715.         }
  15716.         items = Zotero.selectItems(items);
  15717.         for (var i in items) {
  15718.             articles.push(i);
  15719.         }
  15720.     } else {
  15721.         articles = [url];
  15722.     }
  15723.  
  15724.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done;});
  15725. }');
  15726.  
  15727. REPLACE INTO translators VALUES ('0abd577b-ec45-4e9f-9081-448737e2fd34', '1.0.0b4.r5', '', '2008-06-06 08:45:00', '0', '100', '4', 'DSpace', 'Michael Berkowitz', '(dspace|upcommons.upc.edu)', 
  15728. 'function detectWeb(doc, url) {
  15729.     if (doc.evaluate(''//table[@class="itemDisplayTable"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15730.         return "document";
  15731.     } else if (doc.evaluate(''//table[@class="miscTable"]//td[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//div[@id="main"]/ul[@class="browselist"]/li/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15732.         return "multiple";
  15733.     }
  15734. }', 
  15735. 'var itemTypes = {
  15736.     "Article":"journalArticle",
  15737.     "Book":"book",
  15738.     "Thesis":"thesis",
  15739.     "Working Paper":"report",
  15740.     "Technical Report":"report"
  15741. }
  15742.  
  15743. function doWeb(doc, url) {
  15744.     var records = new Array();
  15745.     if (detectWeb(doc, url) == "multiple") {
  15746.         var items = new Object();
  15747.         if (doc.evaluate(''//div[@id="main"]/ul[@class="browselist"]/li/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  15748.             var xpath = ''//div[@id="main"]/ul[@class="browselist"]/li/a'';
  15749.         } else {
  15750.             var xpath = ''//table[@class="miscTable"]//td[2]//a'';
  15751.         }
  15752.         var rows = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  15753.         var row;
  15754.         while (row = rows.iterateNext()) {
  15755.             items[row.href] = row.textContent;
  15756.         }
  15757.         items = Zotero.selectItems(items);
  15758.         for (var i in items) {
  15759.             records.push(i + ''?mode=full'');
  15760.         }
  15761.     } else {
  15762.         records = [url.match(/^([^?]+)\??/)[1] + "?mode=full"];
  15763.     }
  15764.     Zotero.Utilities.processDocuments(records, function(newDoc) {
  15765.         var values = new Object();
  15766.         var fields = newDoc.evaluate(''//table[@class="itemDisplayTable"]/tbody/tr/td[1]'', newDoc, null, XPathResult.ANY_TYPE, null);
  15767.         var data = newDoc.evaluate(''//table[@class="itemDisplayTable"]/tbody/tr/td[2]'', newDoc, null, XPathResult.ANY_TYPE, null);
  15768.         var field2;
  15769.         var datum2;
  15770.         var newItem = new Zotero.Item();
  15771.         while ((field2 = fields.iterateNext()) && (datum2 = data.iterateNext())) {
  15772.             var field = field2.textContent.replace(/^dc\./, "");
  15773.             var datum = datum2.textContent;
  15774.             if (field == "contributor.author") {
  15775.                 var name = datum.split(",");
  15776.                 newItem.creators.push({firstName:name[1], lastName:name[0], creatorType:"author"});
  15777.             } else if (field == "dentifier.uri") {
  15778.                 newItem.url = datum;
  15779.             } else if (field == "title") {
  15780.                 newItem.title = datum;
  15781.             } else if (field == "type") {
  15782.                 if (itemTypes[datum]) {
  15783.                     newItem.itemType = itemTypes[datum];
  15784.                 } else {
  15785.                     newItem.itemType = "document";
  15786.                 }
  15787.             } else if (field == "description.abstract") {
  15788.                 newItem.abstractNote = datum;
  15789.             } else if (field == "date.available") {
  15790.                 newItem.date = datum.replace(/T.*$/, "");
  15791.             } else if (field == "subject") {
  15792.                 newItem.tags.push(datum);
  15793.             } else if (field == "publisher") {
  15794.                 newItem.publisher = datum;
  15795.             } else if (field == "identifier.issn") {
  15796.                 newItem.ISSN = datum;
  15797.             } else if (field == "relation.ispartofseries") {
  15798.                 if (datum.match(/Vol/)) {
  15799.                     newItem.volume = datum.match(/\d+/)[0];
  15800.                 } else if (datum.match(/No/)) {
  15801.                     newItem.issue = datum.match(/\d+/)[0];
  15802.                 }
  15803.             } else if (field == "rights") {
  15804.                 newItem.rights = datum;
  15805.             }
  15806.         }
  15807.         if (newDoc.evaluate(''//td[@class="standard"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) var pdf = newDoc.evaluate(''//td[@class="standard"]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  15808.         newItem.attachments = [{url:newDoc.location.href, title:"DSpace Snapshot", mimeType:"text/html"}];
  15809.         if (pdf) {
  15810.             newItem.attachments.push({url:pdf, title:"DSpace PDF", mimeType:"application/pdf"});
  15811.         }
  15812.         newItem.complete();
  15813.     }, function() {Zotero.done;});
  15814. }');
  15815.  
  15816. REPLACE INTO translators VALUES ('7987b420-e8cb-4bea-8ef7-61c2377cd686', '1.0.0b4.r1', '', '2008-02-06 20:00:00', '0', '100', '4', 'NASA ADS', 'Asa Kusuma and Ramesh Srigiriraju', 'http://(ukads|cdsads|ads|adsabs|esoads|adswww|www.ads)\.(inasan|iucaa.ernet|nottingham.ac|harvard|eso|u-strasbg|nao.ac|astro.puc|bao.ac|on|kasi.re|grangenet|lipi.go|mao.kiev)\.(edu|org|net|fr|jp|cl|id|uk|cn|ua|in|ru|br|kr)/(?:cgi-bin|abs)/', 
  15817. 'function detectWeb(doc, url) {
  15818.     var namespace = doc.documentElement.namespaceURI;
  15819.     var nsResolver = namespace ? function(prefix) {
  15820.         if (prefix == ''x'') return namespace; else return null;
  15821.     } : null;
  15822.     
  15823.     var singXpath = ''//input[@name="bibcode"][@type="hidden"]'';
  15824.     var multXpath = ''//input[@name="bibcode"][@type="checkbox"]'';
  15825.  
  15826.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  15827.         return "multiple";
  15828.     } else if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  15829.         return "journalArticle";
  15830.     }
  15831. }', 
  15832. 'function parseRIS(bibcodes, hostname){
  15833.     var getURL = "http://" + hostname + "/cgi-bin/nph-bib_query?"
  15834.         + bibcodes + "data_type=REFMAN&nocookieset=1";
  15835.     Zotero.Utilities.HTTP.doGet(getURL, function(text){    
  15836.         // load translator for RIS
  15837.         var translator = Zotero.loadTranslator("import");
  15838.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15839.         translator.setString(text);
  15840.         translator.translate();
  15841.         Zotero.done();
  15842.     }, function() {});
  15843.     Zotero.wait();
  15844. }
  15845.  
  15846. function doWeb(doc, url) {
  15847.     var namespace = doc.documentElement.namespaceURI;
  15848.     var nsResolver = namespace ? function(prefix) {
  15849.         if (prefix == ''x'') return namespace; else return null;
  15850.     } : null;
  15851.  
  15852.     var singXpath = ''//input[@name="bibcode"][@type="hidden"]'';
  15853.     var multXpath = ''//input[@name="bibcode"][@type="checkbox"]'';
  15854.     var titleXpath = ''//table/tbody/tr/td[4]''; //will find scores and titles
  15855.     var hostname = doc.location.host
  15856.     var bibElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  15857.     var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  15858.     var titleElmt;
  15859.     var bibElmt;
  15860.  
  15861.     if ((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())) {
  15862.  
  15863.         var items = new Array();
  15864.  
  15865.         do {
  15866.             titleElmt = titleElmts.iterateNext(); //iterate a second time to avoid score
  15867.             items[bibElmt.value] = Zotero.Utilities.cleanString(titleElmt.textContent);
  15868.         } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  15869.         items = Zotero.selectItems(items);
  15870.         if(!items) return true;
  15871.  
  15872.         var bibcodes="";
  15873.         for(var bibcode in items) {
  15874.             bibcodes = bibcodes + "bibcode="+encodeURIComponent(bibcode) + "&";
  15875.         }
  15876.         parseRIS(bibcodes, hostname);        
  15877.                 
  15878.     } else if (bibElmt = doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  15879.         var bibcode = bibElmt.value;
  15880.         var bibcodes = "bibcode="+encodeURIComponent(bibcode) + "&";
  15881.         parseRIS(bibcodes, hostname);
  15882.     }
  15883. }');
  15884.  
  15885. REPLACE INTO translators VALUES ('99f958ab-0732-483d-833f-6bd8e42f6277', '1.0.0b4.r1', '', '2008-05-05 07:45:00', '0', '100', '4', 'National Bureau of Economic Research', 'Michael Berkowitz', '^https?://(?:papers\.|www\.)?nber\.org/(papers|s|new)', 
  15886. 'function detectWeb(doc, url) {
  15887.     var namespace = doc.documentElement.namespaceURI;
  15888.     var nsResolver = namespace ? function(prefix) {
  15889.         if (prefix == ''x'') return namespace; else return null;
  15890.     } : null;
  15891.  
  15892.     if (doc.evaluate(''//a[contains(text(), "RIS")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  15893.         return "journalArticle";
  15894.     } else if (doc.evaluate(''//div[@class="maintd"][@id="maine"]/table/tbody/tr/td[1]//a[contains(@href, "papers/w")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  15895.         return "multiple";
  15896.     }
  15897. }', 
  15898. 'function parseRIS(uris){
  15899.     
  15900.     Zotero.Utilities.HTTP.doGet(uris, function(text){    
  15901.         // load translator for RIS
  15902.         var translator = Zotero.loadTranslator("import");
  15903.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15904.         translator.setString(text);
  15905.         translator.translate();
  15906.         Zotero.done();
  15907.     }, function() {});
  15908.     Zotero.wait();
  15909. }
  15910.  
  15911. function doWeb(doc, url) {
  15912.     var namespace = doc.documentElement.namespaceURI;
  15913.     var nsResolver = namespace ? function(prefix) {
  15914.         if (prefix == ''x'') return namespace; else return null;
  15915.     } : null;
  15916.     
  15917.     var arts = new Array();
  15918.     if (detectWeb(doc, url) == "multiple") {
  15919.         var items = new Object();
  15920.         var links = doc.evaluate(''//div[@class="maintd"][@id="maine"]/table/tbody/tr/td[1]//a[contains(@href, "papers/w")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  15921.         var link;
  15922.         while (link = links.iterateNext()) {
  15923.             if (!link.href.match(/\.pdf$/)) items[link.href] = link.textContent;
  15924.         }
  15925.         items = Zotero.selectItems(items);
  15926.         for (var i in items) {
  15927.             arts.push(i + ''.ris'');
  15928.         }
  15929.     } else {
  15930.         arts = [url + ''.ris''];
  15931.     }
  15932.     Zotero.Utilities.HTTP.doGet(arts, function(text) {
  15933.         var translator = Zotero.loadTranslator("import");
  15934.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15935.         translator.setString(text);
  15936.         translator.setHandler("itemDone", function(obj, item) {
  15937.             if (text.match(/AB\s+\-\s+/)) item.abstractNote = text.match(/AB\s+\-\s+((.|\s)+)\n([A-Z]{2})/)[1];
  15938.             item.notes = new Array();
  15939.             item.complete();    
  15940.         });
  15941.         translator.translate();
  15942.     });
  15943.     Zotero.wait();
  15944. }');
  15945.  
  15946. REPLACE INTO translators VALUES ('411f9a8b-64f3-4465-b7df-a3c988b602f3', '1.0.0b4.r1', '', '2007-06-26 15:17:22', '0', '100', '4', 'RePEc', 'Asa Kusuma', '^https?://ideas\.repec\.org/', 
  15947. 'function detectWeb(doc, url) {
  15948.     var namespace = doc.documentElement.namespaceURI;
  15949.     var nsResolver = namespace ? function(prefix) {
  15950.         if (prefix == ''x'') return namespace; else return null;
  15951.     } : null;
  15952.     
  15953.     var singXpath = ''//html/body/a/table/tbody/tr/td/font/b'';
  15954.     var multXpath = ''//html/body/h2'';
  15955.     
  15956.     
  15957.     
  15958.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  15959.         if(doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Search")!=-1)
  15960.             return "multiple";
  15961.     } else if(doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  15962.         return "journalArticle";
  15963.     }
  15964. }', 
  15965. 'function strrev(str) {
  15966.    if (!str) return '''';
  15967.    var revstr='''';
  15968.    for (i = str.length-1; i>=0; i--)
  15969.        revstr+=str.charAt(i)
  15970.    return revstr;
  15971. }
  15972.  
  15973.  
  15974. function parseRIS(uris) {
  15975.     
  15976.  
  15977.     Zotero.Utilities.HTTP.doGet(uris, function(text){    
  15978.         // load translator for RIS
  15979.         var translator = Zotero.loadTranslator("import");
  15980.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  15981.         translator.setString(text);
  15982.         translator.translate();
  15983.         Zotero.done();
  15984.     }, function() {});
  15985.     Zotero.wait();
  15986. }
  15987.  
  15988. function doWeb(doc, url) {
  15989.     
  15990.     
  15991.     
  15992.     var namespace = doc.documentElement.namespaceURI;
  15993.     var nsResolver = namespace ? function(prefix) {
  15994.         if (prefix == ''x'') return namespace; else return null;
  15995.     } : null;
  15996.     
  15997.     var singXpath = ''//html/body/a/table/tbody/tr/td/font/b'';
  15998.     var multXpath = ''//html/body/h2'';
  15999.     
  16000.     
  16001.  
  16002.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16003.         if(doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Search")!=-1)
  16004.             
  16005.  
  16006.             shortXpath = ''//html/body/strong/a'';
  16007.             longXpath = ''//html/body/dl/dt/strong/a'';
  16008.             var multXpath='''';
  16009.             if(doc.evaluate(shortXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16010.                 multXpath=shortXpath;
  16011.  
  16012.             } else {
  16013.                 multXpath=longXpath;
  16014.  
  16015.             }
  16016.             
  16017.             
  16018.             var bibElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  16019.             var titleElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  16020.             var titleElmt;
  16021.             var bibElmt;
  16022.             bibElmt = bibElmts.iterateNext();
  16023.             titleElmt = titleElmts.iterateNext();
  16024.  
  16025.             var items = new Array();
  16026.  
  16027.             do {
  16028.                 
  16029.                 var bibcode = bibElmt.href;
  16030.  
  16031.                 bibcode=bibcode.substr(24);
  16032.  
  16033.                 bibcode=strrev(bibcode);
  16034.                 bibcode=bibcode.substr(5,bibcode.length);
  16035.                 bibcode=strrev(bibcode);
  16036.                 
  16037.                 //Replace slashes with colons
  16038.                 bibcode=bibcode.replace("/",":","g");
  16039.                 
  16040.                 //Insert colons between numbers and letters and letters and numbers
  16041.                 bibcode=bibcode.replace(/([A-Za-z])([0-9])/g,
  16042.                            function (str, p1, p2, offset, s) {
  16043.                                   return p1 + ":" + p2;
  16044.                            }
  16045.                         )
  16046.  
  16047.                 bibcode=bibcode.replace(/([0-9])([A-Za-z])/g,
  16048.                            function (str, p1, p2, offset, s) {
  16049.                                   return p1 + ":" + p2;
  16050.                            }
  16051.                         )
  16052.                 
  16053.                 items[bibcode] = Zotero.Utilities.cleanString(titleElmt.textContent);
  16054.  
  16055.             } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  16056.  
  16057.             items = Zotero.selectItems(items);
  16058.             if(!items) return true;
  16059.  
  16060.             var bibcodes="";
  16061.             var uris = new Array();
  16062.             for(var bibcode in items) {                
  16063.  
  16064.                 var getURL = "http://ideas.repec.org/cgi-bin/ref.cgi?handle=RePEc";
  16065.                 getURL = getURL + bibcode + "&output=3";
  16066.  
  16067.                 uris.push(getURL);
  16068.             }
  16069.  
  16070.             parseRIS(uris);
  16071.             
  16072.             
  16073.             
  16074.             
  16075.     } else if(doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16076.  
  16077.         var bibcode = url;
  16078.  
  16079.         bibcode=bibcode.substr(24);
  16080.  
  16081.         bibcode=strrev(bibcode);
  16082.         bibcode=bibcode.substr(5,bibcode.length);
  16083.         bibcode=strrev(bibcode);
  16084.         
  16085.  
  16086.         //Replace slashes with colons
  16087.         bibcode=bibcode.replace("/",":","g");
  16088.                 
  16089.         //Insert colons between numbers and letters and letters and numbers
  16090.         bibcode=bibcode.replace(/([A-Za-z])([0-9])/g,
  16091.                    function (str, p1, p2, offset, s) {
  16092.                           return p1 + ":" + p2;
  16093.                    }
  16094.                 )
  16095.  
  16096.         bibcode=bibcode.replace(/([0-9])([A-Za-z])/g,
  16097.                    function (str, p1, p2, offset, s) {
  16098.                           return p1 + ":" + p2;
  16099.                    }
  16100.                 )    
  16101.         
  16102.  
  16103.         var getURL = "http://ideas.repec.org/cgi-bin/ref.cgi?handle=RePEc";
  16104.         getURL = getURL + bibcode + "&output=3";
  16105.                 
  16106.         var idarray = new Array();
  16107.         idarray.push(getURL);
  16108.         parseRIS(idarray);
  16109.         
  16110.     }
  16111.  
  16112.  
  16113. }');
  16114.  
  16115.  
  16116. REPLACE INTO translators VALUES ('e4660e05-a935-43ec-8eec-df0347362e4c', '1.0.0b4.r1', '', '2008-12-15 05:30:00', 1, 100, 4, 'ERIC', 'Ramesh Srigiriraju', '^http://(?:www\.)?eric\.ed\.gov/',
  16117. 'function detectWeb(doc, url)    {
  16118.     var namespace=doc.documentElement.namespaceURI;
  16119.     var nsResolver=namespace?function(prefix)    {
  16120.         return (prefix=="x")?namespace:null;
  16121.     }:null;
  16122.     var searchpath=''//form[@name="searchResultsForm"][@id="searchResultsForm"]'';
  16123.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  16124.         return "multiple";
  16125.     //var singpath=''//tr/td[@class="primaryHeader"][contains(text(), "Record Details")]'';
  16126.     var singpath=''contains(//div[@id="titleBarBlue"]/text(), "Record Details")'';
  16127.     if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).booleanValue)    {
  16128.         var typepath=''//tr[td/span/strong/text()="Pub Types:"]/td[2]/text()'';
  16129.         var typestr=doc.evaluate(typepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  16130.         var typereg=new RegExp("([^;/\-]+)");
  16131.         var typearr=typereg.exec(typestr);
  16132.         if(typearr[1]=="Journal Articles")
  16133.             return "journalArticle";
  16134.         if(typearr[1]=="Information Analyses")
  16135.             return "journalArticle";
  16136.         if(typearr[1]="Machine")
  16137.             return "computerProgram";
  16138.         if(typearr[1]="Computer Programs")
  16139.             return "computerProgram";
  16140.         if(typearr[1]="Dissertations")
  16141.             return "thesis";
  16142.         if(typearr[1]="Reports")
  16143.             return "report";
  16144.         if(typearr[1]="Non")
  16145.             return "audioRecording";
  16146.         if(typearr[1]="Legal")
  16147.             return "statute";
  16148.         else
  16149.             return "book";
  16150.     }
  16151. }',
  16152. 'function doWeb(doc, url)    {
  16153.     var namespace=doc.documentElement.namespaceURI;
  16154.     var nsResolver=namespace?function(prefix)    {
  16155.         return (prefix=="x")?namespace:null;
  16156.     }:null;
  16157.     var searchpath=''//form[@name="searchResultsForm"][@id="searchResultsForm"]'';
  16158.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  16159.         var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp";
  16160.         var idpath=''//a[img]/@id'';
  16161.         var ids=doc.evaluate(idpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  16162.         var items=new Array();
  16163.         var titlpath=''//tr[1]/td[1]/p/a'';
  16164.         var titlerows=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  16165.         var id;
  16166.         while(id=ids.iterateNext())
  16167.             items[id.nodeValue]=Zotero.Utilities.cleanTags(Zotero.Utilities.cleanString(titlerows.iterateNext().textContent));
  16168.         items=Zotero.selectItems(items);
  16169.         var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp?";
  16170.         for(var ids in items)
  16171.             string+="accno="+ids+"&";
  16172.         string+="texttype=endnote&citationtype=brief&Download.x=86&Download.y=14";
  16173.         Zotero.Utilities.HTTP.doGet(string, function(text)    {
  16174.             var trans=Zotero.loadTranslator("import");
  16175.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  16176.             trans.setString(text);
  16177.             trans.setHandler("itemDone", function(obj, newItem)    {
  16178.                 var linkpath=''//tbody[tr/td/a/@id="''+newItem.itemID+''"]/tr/td/p/a[@class="action"]'';
  16179.                 var link=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  16180.                 if(link)
  16181.                     newItem.attachments.push({url:link.href, title:newItem.title, mimeType:"application/pdf"});
  16182.                 newItem.complete();
  16183.             });
  16184.             trans.translate();
  16185.             Zotero.done();
  16186.         });
  16187.         Zotero.wait();
  16188.     }
  16189.     var singpath=''contains(//div[@id="titleBarBlue"]/text(), "Record Details")'';
  16190.     if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).booleanValue)    {
  16191.         var idpath=''//input[@type="hidden"][@name="accno"]/@value'';
  16192.         var idpath2=''//meta[@name="eric #"]/@content'';
  16193.         var id = url.match(/accno=([^&]+)/)[1];
  16194.         var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp?accno=";
  16195.         string+= id+"&texttype=endnote&citationtype=brief&Download.x=86&Download.y=14";
  16196.         Zotero.Utilities.HTTP.doGet(string, function(text)    {
  16197.             var trans=Zotero.loadTranslator("import");
  16198.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  16199.             trans.setString(text);
  16200.             trans.setHandler("itemDone", function(obj, newItem)    {
  16201.                 var linkpath=''//tr/td/p[img/@alt="PDF"]/a'';
  16202.                 var link=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  16203.                 if(link)
  16204.                     newItem.attachments.push({url:link.href, title:newItem.title, mimeType:"application/pdf"});
  16205.                 newItem.complete();
  16206.             });
  16207.             trans.translate();
  16208.             Zotero.done();
  16209.         });
  16210.         Zotero.wait();
  16211.     }
  16212. }');
  16213.  
  16214.  
  16215. REPLACE INTO translators VALUES ('5dd22e9a-5124-4942-9b9e-6ee779f1023e', '1.0.0b4.r5', '', '2009-01-28 18:10:00', 1, 100, 4, 'Flickr', 'Sean Takats', '^http://(?:www\.)?flickr\.com/',
  16216. 'function detectWeb(doc, url) {
  16217.     var namespace = doc.documentElement.namespaceURI;
  16218.     var nsResolver = namespace ? function(prefix) {
  16219.             if (prefix == ''x'') return namespace; else return null;
  16220.         } : null;
  16221.  
  16222.     if (elmt = doc.evaluate(''//h1[@property="dc:title" and starts-with(@id, "title_div")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){                               
  16223.         return "artwork";
  16224.     } else if (doc.evaluate(''//td[@class="DetailPic"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16225.         return "multiple";
  16226.     } else if (doc.evaluate(''//div[contains(@class, "StreamView")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16227.         return "multiple";
  16228.     } else if (doc.evaluate(''//div[@id="setThumbs"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16229.         if (!doc.URL.match(''/comments/'')) {
  16230.             return "multiple";
  16231.         }
  16232.     } else if (doc.evaluate(''//p[@class="StreamList" or @class="UserTagList"]/span/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16233.         return "multiple";
  16234.     }
  16235. }',
  16236. 'function doWeb(doc, url) {
  16237.     var namespace = doc.documentElement.namespaceURI;
  16238.     var nsResolver = namespace ? function(prefix) {
  16239.             if (prefix == ''x'') return namespace; else return null;
  16240.         } : null;
  16241.         
  16242.     var items = new Object();
  16243.     var photo_ids = new Array();
  16244.     var uris = new Array();
  16245.     var key = "3cde2fca0879089abf827c1ec70268b5";
  16246.  
  16247.     var elmts;
  16248.     var elmt;
  16249.  
  16250. // single result
  16251.     if (elmt = doc.evaluate(''//h1[@property="dc:title" and starts-with(@id, "title_div")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){                               
  16252.         var photo_id = elmt.id;
  16253.         photo_id = photo_id.substr(9);
  16254.         photo_ids.push(photo_id);
  16255.     } else { //multiple results
  16256.         var photoRe = /\/photos\/[^\/]*\/([0-9]+)\//;
  16257. //search results
  16258.         if (doc.evaluate(''//td[@class="DetailPic"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16259.             elmts = doc.evaluate(''//td[@class="DetailPic"]//a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16260.             while (elmt = elmts.iterateNext()){
  16261.                 var title = elmt.title;
  16262.                 title = Zotero.Utilities.trimInternal(title);
  16263.                 var link = elmt.href;
  16264.                 var m = photoRe(link);
  16265.                 var photo_id = m[1];
  16266.                 items[photo_id] = title;
  16267.             }
  16268. // photo stream
  16269.         } else if (doc.evaluate(''//div[contains(@class, "StreamView")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16270.             if (doc.evaluate(''//div[contains(@class, "StreamView") and starts-with(@id, "sv_title_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16271.                 elmts = doc.evaluate(''//div[contains(@class, "StreamView") and starts-with(@id, "sv_title_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16272.             } else {
  16273.                 elmts = doc.evaluate(''//div[contains(@class, "StreamView") and starts-with(@id, "sv_body_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16274.             }
  16275.             while (elmt = elmts.iterateNext()){
  16276.                 //var title = Zotero.Utilities.trimInternal(elmt.textContent);
  16277.                 var title = elmt.getElementsByTagName("h4")[0].textContent
  16278.                 var photo_id = elmt.id;
  16279.                 photo_id = photo_id.replace(/(sv_body_|sv_title_)/,''''); 
  16280.                 Zotero.debug("id="+photo_id)
  16281.                 items[photo_id] = title;
  16282.             }
  16283. // photo set
  16284.         } else if (doc.evaluate(''//div[@class="setThumbs-indv"]/span'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16285.             elmts = doc.evaluate(''//div[@class="setThumbs-indv"]/span'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16286.             while (elmt = elmts.iterateNext()){
  16287.                 var title = doc.evaluate(''./a/@title'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16288.                 var photo_id = elmt.id.substr(11);
  16289.                 items[photo_id] = title;
  16290.             }
  16291. // tagged with
  16292.         } else if (doc.evaluate(''//p[@class="StreamList" or @class="UserTagList"]/span/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16293.             var elmts = doc.evaluate(''//p[@class="StreamList" or @class="UserTagList"]//a[img]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16294.             while (elmt = elmts.iterateNext()){
  16295.                 var title = Zotero.Utilities.trimInternal(elmt.title);
  16296.                 var link = elmt.href;
  16297.                 var m = photoRe(link);
  16298.                 var photo_id = m[1];
  16299.                 items[photo_id] = title;
  16300.             }
  16301.         }
  16302.         items = Zotero.selectItems(items);
  16303.         if(!items) return true;
  16304.         for(var i in items) {
  16305.             photo_ids.push(i);
  16306.         }
  16307.     }
  16308.     for each(var photo_id in photo_ids){
  16309.         uris.push("http://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key="+key+"&photo_id="+photo_id);
  16310.     }
  16311.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  16312.         text = text.replace(/<\?xml[^>]*\?>/, "");
  16313.         var xml = new XML(text);
  16314.         var newItem = new Zotero.Item("artwork");
  16315.         var title = "";
  16316.         if (xml..title.length()){
  16317.             var title = Zotero.Utilities.cleanString(xml..title[0].text().toString());
  16318.             if (title == ""){
  16319.                 title = " ";
  16320.             }
  16321.             newItem.title = title;
  16322.         }
  16323.         for(var i=0; i<xml..tag.length(); i++) {
  16324.             newItem.tags.push(Zotero.Utilities.cleanString(xml..tag[i].text().toString()));
  16325.         }
  16326.         if (xml..dates.length()){
  16327.             var date = xml..dates[0].@taken.toString();
  16328.             newItem.date = date.substr(0, 10);
  16329.         }
  16330.         if (xml..owner.length()){
  16331.             var author = xml..owner[0].@realname.toString();
  16332.             if (author == ""){
  16333.                 author = xml..owner[0].@username.toString();
  16334.             }
  16335.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "artist"));
  16336.         }
  16337.         if (xml..url.length()){
  16338.             newItem.url = xml..url[0].text().toString();
  16339.         }
  16340.         if (xml..description.length()){
  16341.             newItem.abstractNote = xml..description[0].text().toString();
  16342.         }
  16343.         var format = xml..photo[0].@originalformat.toString();
  16344.         var photo_id = xml..photo[0].@id.toString();
  16345.         
  16346. // get attachment code
  16347.         var uri = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key="+key+"&photo_id="+photo_id;
  16348.         Zotero.Utilities.HTTP.doGet(uri, function(text) {
  16349.             text = text.replace(/<\?xml[^>]*\?>/, "");
  16350.             var xml = new XML(text);
  16351.             var last = xml..size.length() - 1;
  16352.             var attachmentUri = xml..size[last].@source.toString();
  16353.             newItem.attachments = [{title:title, url:attachmentUri}];
  16354.             newItem.complete();
  16355.         }, function(){Zotero.done();});    
  16356.     });
  16357.     Zotero.wait();
  16358. }');
  16359.  
  16360.  
  16361. REPLACE INTO translators VALUES ('d3b1d34c-f8a1-43bb-9dd6-27aa6403b217', '1.0.0rc4', '', '2009-02-25 07:15:00', 1, 100, 4, 'YouTube', 'Sean Takats and Michael Berkowitz and Matt Burton', 'https?://[^/]*youtube\.com\/',
  16362. 'function detectWeb(doc, url){
  16363.     var namespace = doc.documentElement.namespaceURI;
  16364.     var nsResolver = namespace ? function(prefix) {
  16365.             if (prefix == ''x'') return namespace; else return null;
  16366.         } : null;
  16367.     
  16368.     
  16369.     var xpath = ''//input[@type="hidden" and @name="video_id"]'';
  16370.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16371.         return "videoRecording";
  16372.     }
  16373.     //Search results
  16374.     if (doc.evaluate(''//div[@class="video-long-title"]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16375.         return "multiple";
  16376.     }
  16377.     //playlists
  16378.     if (doc.evaluate(''//div[starts-with(@class, "title")]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){    
  16379.         return "multiple";
  16380.     }
  16381.     // still used?
  16382.     if (doc.evaluate(''//div[@class="vltitle"]/div[@class="vlshortTitle"]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){    
  16383.         return "multiple";
  16384.     }
  16385.     
  16386. }',
  16387. 'function doWeb(doc, url){
  16388.     var namespace = doc.documentElement.namespaceURI;
  16389.     var nsResolver = namespace ? function(prefix) {
  16390.             if (prefix == ''x'') return namespace; else return null;
  16391.         } : null;
  16392.     var host = doc.location.host;
  16393.     var video_ids = new Array();
  16394.     var xpath = ''//input[@type="hidden" and @name="video_id"]'';
  16395.     var elmts;
  16396.     var elmt;
  16397.     elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  16398.     elmt = elmts.iterateNext();
  16399.     if(elmt) {
  16400.         //single video
  16401.         var video_id = elmt.value;
  16402.         video_ids.push(video_id);
  16403.     } else {
  16404.         // multiple videos
  16405.         var items = new Object();
  16406.         var videoRe = /\/watch\?v=([a-zA-Z0-9-_]+)/;
  16407. // search results and community/user pages
  16408.         if (elmt = doc.evaluate(''//div[@class="video-long-title"]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16409.             elmts = doc.evaluate(''//div[@class="video-long-title"]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16410.         } 
  16411.         // playlists
  16412.         else if (doc.evaluate(''//div[starts-with(@class, "title")]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16413.             elmts = doc.evaluate(''//div[starts-with(@class, "title")]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16414.         } 
  16415.         // still used?
  16416.         else if (doc.evaluate(''//div[@class="vltitle"]/div[@class="vlshortTitle"]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  16417.             elmts = doc.evaluate(''//div[@class="vltitle"]/div[@class="vlshortTitle"]/a[contains(@href, "/watch?v=")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16418.         }
  16419.         while (elmt = elmts.iterateNext()){
  16420.             var title = elmt.textContent;
  16421.             title = Zotero.Utilities.trimInternal(title);
  16422.             var link = elmt.href;
  16423.             var m = videoRe(link);
  16424.             var video_id = m[1];
  16425.             items[video_id] = title;
  16426.         }
  16427.         items = Zotero.selectItems(items);
  16428.         if(!items) return true;
  16429.         for(var i in items) {
  16430.             video_ids.push(i);
  16431.         }
  16432.     }
  16433.     getData(video_ids, host);            
  16434. }
  16435.  
  16436. function getData(ids, host){
  16437.     var uris = new Array();    
  16438.     var url = "http://gdata.youtube.com/feeds/videos/";
  16439.     for each(var id in ids){
  16440.         uris.push(url+id);
  16441.     }
  16442.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  16443.         // clean up header
  16444.         text = text.replace(/<\?xml[^>]*\?>/, "");
  16445.         text = text.replace(/<entry[^>]*>/, "<entry>");
  16446.         // replace colons in XML tags
  16447.         text = text.replace(/<media:/g, "<media_").replace(/<\/media:/g, "</media_");
  16448. //        text = text.replace(/<yt:/g, "<yt_").replace(/<\/yt:/g, "</yt_");
  16449.         text = text.replace(/yt:/g, "yt_");
  16450.         text = text.replace(/<gd:/g, "<gd_").replace(/<\/gd:/g, "</gd_");
  16451.         text = text.replace(/<\/?(georss|gml)[^>]+>/g, "");
  16452.         // pad xml
  16453.         text = "<zotero>"+text+"</zotero>";
  16454.         var xml = new XML(text);
  16455.         var newItem = new Zotero.Item("videoRecording");
  16456.         var title = "";
  16457.         var title = xml..media_title[0].text().toString();
  16458.         if (xml..media_title.length()){
  16459.             var title = Zotero.Utilities.trimInternal(xml..media_title[0].text().toString());
  16460.             if (title == ""){
  16461.                 title = " ";
  16462.             }
  16463.             newItem.title = title;
  16464.         }
  16465.         if (xml..media_keywords.length()){
  16466.             var keywords = xml..media_keywords[0].text().toString();
  16467.             keywords = keywords.split(",");
  16468.             for each(var tag in keywords){
  16469.                 newItem.tags.push(Zotero.Utilities.trimInternal(tag));
  16470.             }
  16471.         }
  16472.         if (xml..published.length()){
  16473.             var date = xml..published[0].text().toString();
  16474.             newItem.date = date.substr(0, 10);
  16475.         }
  16476.         if (xml..author.name.length()){
  16477.             var author = xml..author.name[0].text().toString();
  16478.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "contributor", true));
  16479.         }
  16480.         if (xml..media_player.length()){
  16481.             var url = xml..media_player[0].@url.toString();
  16482.             newItem.url = url;
  16483.             newItem.attachments.push({title:"YouTube Link", snapshot:false, mimeType:"text/html", url:url});
  16484.         }
  16485.         if (xml..yt_duration.length()){
  16486.             var runningTime = xml..yt_duration[0].@seconds.toString();
  16487.             newItem.runningTime = runningTime + " seconds";
  16488.         }
  16489.         if (xml..media_description.length()){
  16490.             newItem.abstractNote = xml..media_description[0].text().toString();
  16491.         }
  16492.         /*
  16493. //temporary fix for downloads using techcrunch
  16494.         var techcrunchurl = "http://www.techcrunch.com/ytdownload3.php?url="+encodeURIComponent(newItem.url)+"&submit=Get+Video";
  16495.         Zotero.debug(techcrunchurl);
  16496.         Zotero.Utilities.HTTP.doGet(techcrunchurl, function(text) {
  16497.             var flv = text.match(/HREF=''([^'']+)''/);
  16498.             if (flv[1]){
  16499.                 flv = flv[1];
  16500.                 // title parameter needs to be encoded
  16501.                 var title = flv.match(/&title=([^&]+)/);
  16502.                 if (title[1]){
  16503.                     title = encodeURIComponent(title[1]);
  16504.                     flv = flv.replace(/&title=([^&]+)/, title);
  16505.                 }
  16506.                 newItem.attachments.push({url:flv, title:"YouTube Video Recording", mimeType:"video/x-flv"});
  16507.             }
  16508.             newItem.complete();
  16509.         }, function() {Zotero.done();});
  16510.         */
  16511.         newItem.complete();
  16512.         Zotero.done();
  16513.     });
  16514.     Zotero.wait();
  16515. }');
  16516.  
  16517.  
  16518. REPLACE INTO translators VALUES ('e16095ae-986c-4117-9cb6-20f3b7a52f64', '1.0.0b4.r5', '', '2008-02-19 17:00:00', '0', '100', '4', 'Protein Data Bank', 'Michael Berkowitz', 'http://www.pdb.org/', 
  16519. 'function detectWeb(doc, url) {
  16520.     if (doc.title.indexOf("Query Results") != -1) {
  16521.         return "multiple";
  16522.     } else if (url.indexOf("structureId") != -1) {
  16523.         return "journalArticle";
  16524.     }
  16525. }', 
  16526. 'function doWeb(doc, url) {
  16527.     var proteins = new Array();
  16528.     if (detectWeb(doc, url) == "multiple") {
  16529.         //search results
  16530.         var items = new Object();
  16531.         var xpath = ''//a[@class="qrb_title"]'';
  16532.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  16533.         var next_title;
  16534.         while (next_title = titles.iterateNext()) {
  16535.             items[next_title.href.match(/structureId=(.*)/)[1]] = next_title.textContent;
  16536.         }
  16537.         items = Zotero.selectItems(items);
  16538.         for (var i in items) {
  16539.             proteins.push(i);
  16540.         }
  16541.     } else {
  16542.         proteins = [url.match(/structureId=(.*)/)[1]];
  16543.     }
  16544.     
  16545.     Zotero.debug(proteins);
  16546.     for (var p in proteins) {
  16547.         var xmlstr = ''http://www.pdb.org/pdb/download/downloadFile.do?fileFormat=xml&headerOnly=YES&structureId='' + proteins[p];
  16548.         Zotero.debug(xmlstr);
  16549.         
  16550.         Zotero.Utilities.HTTP.doGet(xmlstr, function(text) {
  16551.             var item = new Zotero.Item("journalArticle");
  16552.             text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "").replace(/PDBx\:/g, "");
  16553.             var article = text.split(''<citation id="primary">'');
  16554.             var art = article[1].split(/<\/citation>\n/);
  16555.             art = "<citation>" + art[0] + "</citation>";
  16556.             var xml = new XML(art);
  16557.             var info = text.split(''<database_PDB_revCategory>'')[1].split(''</database_PDB_revCategory>'')[0];
  16558.             var xml2 = new XML("<PDB_revCategory>" + info + "</PDB_revCategory>");
  16559.             var aus = text.split(''<citation_authorCategory>'')[1].split(''</citation_authorCategory>'')[0];
  16560.             aus = "<authors>" + aus + "</authors>";
  16561.             var xml3 = new XML(aus);
  16562.             
  16563.             item.title = xml..title.text().toString();
  16564.             item.publicationTitle = xml..journal_abbrev.text().toString();
  16565.             item.volume = xml..journal_volume.text().toString();
  16566.             item.pages = xml..page_first.text().toString() + "-" + xml..page_last.text().toString();
  16567.             item.ISSN = xml..journal_id_ISSN.text().toString();
  16568.             item.extra = "PubMed ID: " + xml..pdbx_database_id_PubMed.text().toString();
  16569.             if (xml..pdbx_database_id_DOI.length()) {
  16570.                 item.DOI = xml..pdbx_database_id_DOI.text().toString();
  16571.             }
  16572.             item.date = xml2..date_original.text().toString();
  16573.             item.url = ''http://www.pdb.org/pdb/explore/explore.do?structureId='' + xml2..replaces.text().toString();
  16574.             
  16575.             var authors = xml3..citation_author.toString().split(/\n/);
  16576.             for (var i in authors) {
  16577.                 var name = authors[i].match(/name=\"([^"]+)\"/)[1].split(", ");;
  16578.                 Zotero.debug(name);
  16579.                 item.creators.push({firstName:name[1], lastName:name[0], creatorType:"author"});
  16580.             }
  16581.             item.attachments = [
  16582.                 {url:item.url, title:"PDB Snapshot", mimeType:"text/html"},
  16583.                 {url:''http://www.pdb.org/pdb/download/downloadFile.do?fileFormat=pdb&compression=NO&structureId='' + proteins[p], title:"Protein Data Bank .pdb File", mimeType:"chemical/x-pdb"}
  16584.             ]
  16585.             item.complete();
  16586.         });
  16587.         Zotero.done;
  16588.     }
  16589.     Zotero.wait();
  16590. }');
  16591.  
  16592. REPLACE INTO translators VALUES ('0a01d85e-483c-4998-891b-24707728d83e', '1.0.0b4.r5', '', '2008-02-14 23:15:00', '0', '100', '4', 'AJHG', 'Michael Berkowitz', 'http://(www.)?ajhg.org/', 
  16593. 'function detectWeb(doc, url) {
  16594.     if (doc.evaluate(''//div[@class="article_links"]/a[1]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16595.         return "multiple";
  16596.     } else if (url.indexOf("abstract") != -1 || url.indexOf("fulltext") != -1) {
  16597.         return "journalArticle";
  16598.     }
  16599. }', 
  16600. 'function getID(str) {
  16601.     str =  str.match(/\/([^/]+)$/)[1];
  16602.     if (str.indexOf("#") != -1) {
  16603.         str = str.substr(0, str.length - 1);
  16604.     }
  16605.     return str;
  16606. }
  16607.  
  16608. function doWeb(doc, url) {
  16609.     var articles = new Array();
  16610.     if (detectWeb(doc, url) == "multiple") {
  16611.         var items = new Object();
  16612.         if (doc.title.indexOf("Search Results") != -1) {
  16613.             var xpath = ''//table[@id="search_results"]/tbody/tr/td[1]'';
  16614.             var titlex = ''./strong'';
  16615.             var linkx = ''./div/a[1]'';
  16616.         } else {
  16617.             var xpath = ''//div[@id="main_toc"]/dl'';
  16618.             var titlex = ''./dt'';
  16619.             var linkx = ''./dd/div/a[1]'';
  16620.         }
  16621.         var blocks = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  16622.         var next_block;
  16623.         while (next_block = blocks.iterateNext()) {
  16624.             var title = doc.evaluate(titlex, next_block, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16625.             var link = doc.evaluate(linkx, next_block, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  16626.             items[link] = title;
  16627.         }
  16628.         items = Zotero.selectItems(items);
  16629.         for (var i in items) {
  16630.             articles.push(getID(i));
  16631.         }
  16632.     } else {
  16633.         articles = [getID(url)];
  16634.     }
  16635.     Zotero.debug(articles);
  16636.     for (var i in articles) {
  16637.         var poststr = ''format=cite-abs&citation-type=RIS&pii='' + articles[i] + ''&action=download&Submit=Export'';
  16638.         var pdfurl = ''http://download.ajhg.org/AJHG/pdf/PII'' + articles[i].replace(/(\(|\)|\-)/g, "") + ''.pdf'';
  16639.         var newurl = ''http://www.ajhg.org/AJHG/fulltext/'' + articles[i];
  16640.         Zotero.Utilities.HTTP.doPost(''http://ajhg.org/AJHG/citationexport'', poststr, function(text) {
  16641.             var trans = Zotero.loadTranslator("import");
  16642.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  16643.             trans.setString(text);
  16644.             trans.setHandler("itemDone", function(obj, item) {
  16645.                 item.attachments = [
  16646.                     {url:newurl, title:"AJHG Snapshot", mimeType:"text/html"},
  16647.                     {url:pdfurl, title:"AJHG Full Text PDF", mimeType:"application/pdf"}
  16648.                 ];
  16649.                 
  16650.                 if (item.notes[0]["note"]) {
  16651.                     item.abstractNote = item.notes[0]["note"];
  16652.                 }
  16653.                 item.notes = [];
  16654.                 item.complete();
  16655.             });
  16656.             trans.translate();
  16657.             Zotero.done();
  16658.         });
  16659.     }
  16660.     Zotero.wait();
  16661.     
  16662. }');
  16663.  
  16664. REPLACE INTO translators VALUES ('f26cfb71-efd7-47ae-a28c-d4d8852096bd', '1.0.0b4.r5', '', '2008-07-07 14:50:00', '0', '99', '4', 'Cell Press', 'Michael Berkowitz', 'http://www.(cancercell|cell|cellhostandmicrobe|cellmetabolism|cellstemcell|chembiol|current-biology|developmentalcell|immunity|molecule|neuron|structure).(org|com)', 
  16665. 'function detectWeb(doc, url) {
  16666.     
  16667.     if (url.indexOf("search/results") != -1) {
  16668.         return "multiple";
  16669.     } else if (url.indexOf("content/article") != -1) {
  16670.         return "journalArticle";
  16671.     }
  16672. }', 
  16673. 'function scrape(doc, url) {
  16674.  
  16675.     var namespace = doc.documentElement.namespaceURI;
  16676.     var nsResolver = namespace ? function(prefix) {
  16677.         if (prefix == ''x'') return namespace; else return null;
  16678.     } : null;    
  16679.     
  16680.     var dataTags = new Object();
  16681.     var fieldTitle;
  16682.     var commaSplit = new Array();
  16683.     
  16684.     var newItem = new Zotero.Item("journalArticle");
  16685.         
  16686.     //title    
  16687.         newItem.title = doc.evaluate(''//h1[@class="article_title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16688.             
  16689.     //publication, volume, pages, date.
  16690.         var voliss = doc.evaluate(''//div[contains(@class, "article_citation")]/p[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16691.         
  16692.         var volissSplit = voliss.split(".");
  16693.         
  16694.         for (var i = 0; i < volissSplit.length; i++) {
  16695.             if (volissSplit[i].match(", ")) {
  16696.                 commaSplit = volissSplit[i].split(", ");
  16697.             }
  16698.         }
  16699.         if (commaSplit[0] != '''') {
  16700.             newItem.publicationTitle = commaSplit[0];
  16701.         }
  16702.         if (commaSplit[1] != '''') {
  16703.             newItem.volume = commaSplit[1];
  16704.         }
  16705.         if (commaSplit[2] != '''') {
  16706.             newItem.pages= commaSplit[2];
  16707.         }
  16708.         if (commaSplit[3] != '''') {
  16709.             newItem.date= commaSplit[3];
  16710.         }
  16711.  
  16712.     //abstract
  16713.     
  16714.         var abstractXPath2 = ''//div[@class="min_fulltext"][@id="main_content"]/p'';
  16715.         if (doc.evaluate(abstractXPath2, doc,  nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16716.             newItem.abstractNote = doc.evaluate(abstractXPath2, doc,  nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16717.         }
  16718.         
  16719.         var abstractXPath = ''//div[@class="panelcontent article_summary"]/p[contains(text(), " ")]'';
  16720.         if (doc.evaluate(abstractXPath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  16721.             newItem.abstractNote = doc.evaluate(abstractXPath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16722.         }
  16723.  
  16724.     //authors
  16725.         var authors = doc.evaluate(''//p[@class="authors"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(",");
  16726.         for (var i in authors) {
  16727.             var next_author = authors[i];
  16728.             if (next_author.match(/[a-z]/)) {
  16729.                 next_author = Zotero.Utilities.trimInternal(next_author.replace(/\d/g, ""));
  16730.                 if (next_author.substr(0, 3) == "and") {
  16731.                     next_author = next_author.substr(4);
  16732.                 }
  16733.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(next_author, "author"));
  16734.             }
  16735.         }
  16736.     
  16737.     //url
  16738.         var newurl = doc.location.href;
  16739.         if (newurl.indexOf("abstract") != -1) {
  16740.             newurl = newurl.replace("abstract", "fulltext");
  16741.         }
  16742.         
  16743.     //attachments    
  16744.         var uid = newurl.match(/uid=([^&]+)/)[1];
  16745.         var pdfx = ''//a[contains(text(), "PDF")][contains(@href, "'' + uid + ''")]'';
  16746.         var pdfurl = doc.evaluate(pdfx, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  16747.         newItem.attachments = [
  16748.             {url:newurl, title:"Cell Press Snapshot", mimeType:"text/html"},
  16749.             {url:pdfurl, title:"Cell Press Full Text PDF", mimeType:"application/pdf"}
  16750.         ];
  16751.         
  16752.         newItem.complete();
  16753. }
  16754.  
  16755. function doWeb(doc, url) {
  16756.     var namespace = doc.documentElement.namespaceURI;
  16757.     var nsResolver = namespace ? function(prefix) {
  16758.     } : null;
  16759.     
  16760.     var articles = new Array();
  16761.     
  16762.     if (detectWeb(doc, url) == "multiple") {
  16763.         var items = new Object();
  16764.         
  16765.         var titles = doc.evaluate(''//dd/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16766.         var link = doc.evaluate(''//nobr/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  16767.         
  16768.         var next_title;
  16769.         var next_lilnk;
  16770.         
  16771.         while (next_title = titles.iterateNext()) {
  16772.             next_link = link.iterateNext();
  16773.             if (next_link.textContent.match("Summary")) {
  16774.                 items[next_link.href] = next_title.textContent;
  16775.             } else {
  16776.                 next_link = link.iterateNext();
  16777.                 items[next_link.href] = next_title.textContent;
  16778.             }
  16779.         }
  16780.         items = Zotero.selectItems(items);
  16781.         for (var i in items) {
  16782.             articles.push(i);
  16783.         }
  16784.     } else {
  16785.         articles = [url];
  16786.     }
  16787.     Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});
  16788.     Zotero.wait();
  16789. }');
  16790.  
  16791.  
  16792. REPLACE INTO translators VALUES ('0cc8e259-106e-4793-8c26-6ec8114a9160', '1.0.0b4.r5', '', '2008-02-13 11:30:00', '1', '99', '4', 'SlideShare', 'Michael Berkowitz', 'http://www.slideshare.net/', 
  16793. 'function detectWeb(doc, url) {
  16794.     if (url.indexOf("search") != -1) {
  16795.         return "multiple";
  16796.     } else if (doc.evaluate(''//div[@class="slideProfile"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16797.         return "presentation";
  16798.     }
  16799. }', 
  16800. 'function doWeb(doc, url) {
  16801.     var loggedin = false;
  16802.     if (doc.evaluate(''//a[@class="green_link"][text() = "logout"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16803.         loggedin = true;
  16804.     }
  16805.     var shows = new Array();
  16806.     if (detectWeb(doc, url) == "multiple") {
  16807.         var items = new Object();
  16808.         var links = doc.evaluate(''//div[@class="search_list_box"]/div[@class="text_12"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  16809.         var next_link;
  16810.         while (next_link = links.iterateNext()) {
  16811.             items[next_link.href] = Zotero.Utilities.trimInternal(next_link.textContent);
  16812.         }
  16813.         items = Zotero.selectItems(items);
  16814.         if (!items) {
  16815.             return true;
  16816.         }
  16817.         for (var i in items) {
  16818.             shows.push(i);
  16819.         }
  16820.     } else {
  16821.         shows = [url];
  16822.     }
  16823.     Zotero.Utilities.processDocuments(shows, function(newDoc) {
  16824.         var downloadable = true;
  16825.         if (newDoc.evaluate(''//p[@class="upload_p_left"][contains(text(), "Download not available")]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16826.             downloadable = false;
  16827.         }
  16828.         var item = new Zotero.Item("presentation");
  16829.         item.title = newDoc.evaluate(''//div[@class="slideProfile"]//h3'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16830.         var creator = newDoc.evaluate(''//div[@class="slideProfile"]//p/a[@class="blue_link_normal"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16831.         item.creators.push(Zotero.Utilities.cleanAuthor(creator, "author"));
  16832.         var tags = newDoc.evaluate(''//a[@class="grey_tags"]'', newDoc, null, XPathResult.ANY_TYPE, null);
  16833.         var next_tag;
  16834.         while (next_tag = tags.iterateNext()) {
  16835.             item.tags.push(Zotero.Utilities.trimInternal(next_tag.textContent));
  16836.         }
  16837.         var newurl = newDoc.location.href;
  16838.         item.url = newurl;
  16839.         item.repository = "SlideShare";
  16840.         var pdfurl;
  16841.         if (newurl.substr(-1) == "/") {
  16842.             pdfurl = newurl + "download";
  16843.         } else {
  16844.             pdfurl = newurl + "/download";
  16845.         }
  16846.         if (loggedin) {
  16847.             if (downloadable) {
  16848.                 item.attachments.push({url:pdfurl, title:"SlideShare Slide Show", mimeType:"application/pdf"});
  16849.             }
  16850.         }
  16851.         item.complete();
  16852.     }, function() {Zotero.done;});
  16853. }');
  16854.  
  16855. REPLACE INTO translators VALUES ('8b35ab14-f18a-4f69-8472-b2df18c984da', '1.0.0b4.r5', '', '2008-04-01 04:50:00', '1', '100', '4', 'Davidson College Library', 'Michael Berkowitz', 'http://www.lib.davidson.edu/', 
  16856. 'function detectWeb(doc, url) {
  16857.     if (url.indexOf("log_in") == -1) {
  16858.         if (url.indexOf("screen=Record") != -1) {
  16859.             return "book";
  16860.         } else {
  16861.             return "multiple";
  16862.         }
  16863.     }
  16864. }', 
  16865. 'function doWeb(doc, url) {
  16866.     var books = new Array();
  16867.     if (detectWeb(doc, url) == "multiple") {
  16868.         var items = Zotero.Utilities.getItemArray(doc, doc, ''screen=Record.html'');
  16869.         items = Zotero.selectItems(items);
  16870.         for (var i in items) {
  16871.             books.push(i.replace("Record.html", "MARCRecord.html"));
  16872.         }
  16873.     } else {
  16874.         books = [url.replace("Record.html", "MARCRecord.html")];
  16875.     }
  16876.     
  16877.     var translator = Zotero.loadTranslator("import");
  16878.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  16879.     var marc = translator.getTranslatorObject();
  16880.     Zotero.Utilities.processDocuments(books, function(newDoc) {
  16881.         var uri = newDoc.location.href;
  16882.         var namespace = newDoc.documentElement.namespaceURI;
  16883.         var nsResolver = namespace ? function(prefix) {
  16884.           if (prefix == ''x'') return namespace; else return null;
  16885.         } : null;
  16886.         var nonstandard = false;
  16887.         var xpath;
  16888.         var xpath = ''//td[@class="body"]/p/table/tbody/tr[td[3]]'';
  16889.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  16890.         var elmt;
  16891.         var record = new marc.record();
  16892.         while(elmt = elmts.iterateNext()) {
  16893.             var field = Zotero.Utilities.trimInternal(newDoc.evaluate(''./td[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  16894.             if(field) {
  16895.                 var value = newDoc.evaluate(''./td[3]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  16896.                 if(field == "LDR") {
  16897.                     record.leader = value;
  16898.                 } else if(field != "FMT") {
  16899.                     value = value.replace(/\$([a-z]) /g, marc.subfieldDelimiter+"$1");
  16900.                     var code = field.substring(0, 3);
  16901.                     var ind = "";
  16902.                     if(field.length > 3) {
  16903.                         ind = field[3];
  16904.                         if(field.length > 4) {
  16905.                             ind += field[4];
  16906.                         }
  16907.                     }
  16908.                 
  16909.                     record.addField(code, ind, value);
  16910.                 }
  16911.             }
  16912.         }
  16913.         
  16914.         var newItem = new Zotero.Item();
  16915.         record.translate(newItem);
  16916.         
  16917.         var domain = url.match(/https?:\/\/([^/]+)/);
  16918.         newItem.repository = "Davidson College Library Catalog";
  16919.         newItem.complete();
  16920.     }, function() {Zotero.done;});
  16921.     Zotero.wait();
  16922. }');
  16923.  
  16924. REPLACE INTO translators VALUES ('1885b93c-cf37-4b25-aef5-283f42eada9d', '1.0.0b4.r5', '', '2008-08-19 10:30:00', '0', '100', '4', 'Informaworld', 'Michael Berkowitz', 'http://www.informaworld.com', 
  16925. 'function detectWeb(doc, url) {
  16926.     if (url.indexOf("quicksearch") != -1) {
  16927.         return "multiple";
  16928.     } else if (doc.evaluate(''//a[substring(text(), 2, 8) = "Download"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16929.         if (doc.evaluate(''//div[@id="metahead"]/div/strong[text() = "Published in:"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16930.             var pubtype = doc.evaluate(''//img[substring(@title, 1, 17) = "Publication type:"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().title;
  16931.             if (pubtype.match("journal")) {
  16932.                 return "journalArticle";
  16933.             } else if (pubtype.match("book")) {
  16934.                 return "bookSection";
  16935.             }
  16936.         } else {
  16937.             return "book";
  16938.         }
  16939.     } else if (url.indexOf("content=g") != -1 || 
  16940.             doc.evaluate(''//div[@id="browse"]//tbody/tr/td[2]/a[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
  16941.             doc.evaluate(''//div[@id="title"]//td[2]/div/strong/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16942.         return "multiple";
  16943.     } else {
  16944.         return true;
  16945.     }
  16946. }
  16947. ', 
  16948. 'function doWeb(doc, url) {
  16949.     var links = new Array();
  16950.     if (detectWeb(doc, url) == "multiple") {
  16951.         var items = new Object();
  16952.         if (doc.evaluate(''//div[@id="quicksearch"]//tr/td/b/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16953.             var xpath = ''//div[@id="quicksearch"]//tr/td/b/a'';
  16954.         } else if (doc.evaluate(''//div[@id="title"]/table/tbody/tr[2]//strong/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16955.             var xpath = ''//div[@id="title"]/table/tbody/tr[2]//strong/a'';
  16956.         } else if (doc.evaluate(''//div[@id="browse"]//tbody/tr/td[2]/a[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16957.             var xpath = ''//div[@id="browse"]//tbody/tr/td[2]/a[2]'';
  16958.         } else if (doc.evaluate(''//div[@id="title"]//td[2]/div/strong/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  16959.             var xpath = ''//div[@id="title"]//td[2]/div/strong/a'';
  16960.         }
  16961.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  16962.         var title = titles.iterateNext();
  16963.         while (title) {
  16964.             items[title.href] = title.textContent;
  16965.             title = titles.iterateNext();
  16966.         }
  16967.         items = Zotero.selectItems(items);
  16968.         for (var i in items) {
  16969.             links.push(i);
  16970.         }
  16971.     } else {
  16972.         links = [url];
  16973.     }
  16974.     Zotero.debug(links);
  16975.     
  16976.     Zotero.Utilities.processDocuments(links, function(newDoc) {
  16977.         var xpath = ''//div[@id="metahead"]/div'';
  16978.         var stuff = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null);
  16979.         var thing = stuff.iterateNext() ;
  16980.         while (thing) {
  16981.             if (thing.textContent.match(/DOI/)) {
  16982.                 var doi = Zotero.Utilities.trimInternal(thing.textContent).match(/:\s+(.*)/)[1];
  16983.             }
  16984.             thing = stuff.iterateNext();
  16985.         }
  16986.         var pdfurl = newDoc.evaluate(''//div[@id="content"]/div/a[1]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  16987.         var id = newDoc.location.href.match(/content=([\w\d]+)/);
  16988.         var post = ''tab=citation&selecteditems='' + id[1].substr(1) + ''&content='' + id[1] + ''&citstyle=refworks&showabs=false&format=file'';
  16989.         Zotero.Utilities.HTTP.doPost(''http://www.informaworld.com/smpp/content'', post, function(text) {
  16990.             text = text.replace(/RT/, "TY");
  16991.             text = text.replace(/VO/, "VL");
  16992.             text = text.replace(/LK/, "UR");
  16993.             text = text.replace(/YR/, "PY");
  16994.             text = text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - ")
  16995.             var translator = Zotero.loadTranslator("import");
  16996.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  16997.             translator.setString(text);
  16998.             translator.setHandler("itemDone", function(obj, item) {
  16999.                 var type = text.match(/TY\s+\-\s+([^\n]*)/)[1];
  17000.                 if (type == "Journal") {
  17001.                     item.itemType = "journalArticle";
  17002.                 } else if (type == "Book, Whole") {
  17003.                     item.itemType = "book";
  17004.                 } else if (type == "Book, Section") {
  17005.                     item.itemType = "bookSection";
  17006.                 }
  17007.                 if (doi) {
  17008.                     item.DOI = doi;
  17009.                 }
  17010.                 item.attachments.push({url:pdfurl, title:item.title, mimeType:''application/pdf''});
  17011.                 item.complete();
  17012.             });
  17013.             translator.translate();
  17014.             
  17015.         });
  17016.     }, function() {Zotero.done;});
  17017. }');
  17018.  
  17019. REPLACE INTO translators VALUES ('f880bf79-d42f-4337-b0d2-7a7de4a48b7d', '1.0.0b4.r5', '', '2008-02-06 21:00:00', '0', '100', '4', 'Library Catalog (X-OPAC)', 'Michael Berkowitz', '(xopac|hylib)', 
  17020. 'function detectWeb(doc, url) {
  17021.     if (url.indexOf("&nd=") != -1) {
  17022.         return "book";
  17023.     } else if (url.indexOf("Aktion") != -1) {
  17024.         return "multiple";
  17025.     }
  17026. }', 
  17027. 'function doWeb(doc, url) {
  17028.     var ids = new Array();
  17029.     if (detectWeb(doc, url) == "multiple") {
  17030.         var xpath = ''//table/tbody/tr/td//a'';
  17031.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  17032.         var link = links.iterateNext();
  17033.         var items = new Object();
  17034.         while (link) {
  17035.             if (link.href.match(/&nd=\d+/)) {
  17036.                 items[link.href.match(/&nd=(\d+)/)[1]] = Zotero.Utilities.trimInternal(link.textContent);
  17037.             }
  17038.             link = links.iterateNext();
  17039.         }
  17040.         items = Zotero.selectItems(items);
  17041.         for (var i in items) {
  17042.             ids.push(i);
  17043.         }
  17044.     } else {
  17045.         ids = [url.match(/&nd=(\d+)/)[1]];
  17046.     }
  17047.     Zotero.debug(ids);
  17048.     for (var i = 0 ; i < ids.length ; i++) {
  17049.         var post = ''db=ubfr&nd='' + ids[i] + ''&counter=0&Aktion=S&VomOLAF=0&links=1&gk=&format=ris'';
  17050.         Zotero.Utilities.HTTP.doPost(''http://www.ub.uni-freiburg.de/cgi-bin/refman'', post, function(text) {
  17051.             //Zotero.debug(text);
  17052.             var translator = Zotero.loadTranslator("import");
  17053.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17054.             translator.setString(text);
  17055.             translator.translate();
  17056.         });
  17057.     }
  17058. }');
  17059.  
  17060. REPLACE INTO translators VALUES ('0cdc6a07-38cf-4ec1-b9d5-7a3c0cc89b15', '1.0.0b4.r5', '', '2008-08-20 15:20:00', '0', '100', '4', 'OSTI Energy Citations', 'Michael Berkowitz', 'http://www.osti.gov/energycitations', 
  17061. 'function detectWeb(doc, url) {
  17062.     if (doc.evaluate(''//table[@class="searchresults"]//a[@class="citation"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17063.         return "multiple";
  17064.     } else if (url.indexOf("product.biblio.jsp") != -1) {
  17065.         return "journalArticle";
  17066.     }
  17067. }', 
  17068. 'function doWeb(doc, url) {
  17069.     var urls = new Array();
  17070.     if (detectWeb(doc, url) == "multiple") {
  17071.         var items = new Object();
  17072.         var xpath = ''//table[@class="searchresults"]//a[@class="citation"]'';
  17073.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  17074.         var next_link;
  17075.         while (next_link = links.iterateNext()) {
  17076.             items[next_link.href] = next_link.textContent;
  17077.         }
  17078.         items = Zotero.selectItems(items);
  17079.         for (var i in items) {
  17080.             urls.push(i.match(/osti_id=\d+/)[0]);
  17081.         }
  17082.     } else {
  17083.         urls = [url.match(/osti_id=\d+/)[0]];
  17084.     }
  17085.     for (var i = 0 ; i < urls.length ; i++) {
  17086.         var getstr = ''http://www.osti.gov/energycitations/endnote?'' + urls[i];
  17087.         Zotero.Utilities.HTTP.doGet(getstr, function(text) {
  17088.             Zotero.debug(text);
  17089.             text = text.replace(/(%.)/g, "$1 ");
  17090.             var trans = Zotero.loadTranslator("import");
  17091.             trans.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  17092.             trans.setString(text);
  17093.             trans.translate();
  17094.         });
  17095.     }
  17096. }');
  17097.  
  17098. REPLACE INTO translators VALUES ('4345839f-b4fd-4e3f-a73d-268b6f280f6e', '1.0.0b4.r5', '', '2008-01-29 20:00:00', '0', '100', '4', 'Journal of Vision', 'Michael Berkowitz', 'http://(www.)?journalofvision.org/', 
  17099. 'function detectWeb(doc, url) {
  17100.     if (url.indexOf("search.aspx?") != -1 ||  url.match(/\d+/g).length == 2) {
  17101.         return "multiple";
  17102.     } else if (url.match(/\d+/g).length == 3) {
  17103.         return "journalArticle";
  17104.     }
  17105. }', 
  17106. 'function doWeb(doc, url) {
  17107.     var urls = new Array();
  17108.     if (detectWeb(doc, url) == "multiple") {
  17109.         var items = new Object();
  17110.          if (doc.evaluate(''//a[@class="AbsTitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17111.              var xpath = ''//a[@class="AbsTitle"]'';
  17112.          } else if (doc.evaluate(''//a[@class="toc_ArticleTitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17113.              var xpath = ''//a[@class="toc_ArticleTitle"]'';
  17114.          }
  17115.          var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  17116.          var next_art;
  17117.          while (next_art = articles.iterateNext()) {
  17118.              items[next_art.href] = next_art.textContent;
  17119.          }
  17120.         items = Zotero.selectItems(items);
  17121.         for (var i in items) {
  17122.             urls.push(i);
  17123.         }
  17124.     } else {
  17125.         urls.push(url);
  17126.     }
  17127.     Zotero.debug(urls);
  17128.     
  17129.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  17130.         var rislink = newDoc.evaluate(''//div[@id="block0"]/table/tbody/tr/td[@class="body"]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace("info/GetCitation", "AutomaticCitationDownload") + ''&type=ReferenceManager'';
  17131.         var DOI = newDoc.evaluate(''//td[2]/span[@class="toc_VolumeLine"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/doi:\s*(.*)$/)[1];
  17132.         var PDF = newDoc.evaluate(''//div[@class="jovHistory"]//td[2]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  17133.         Zotero.debug(rislink);
  17134.         Zotero.Utilities.HTTP.doGet(rislink, function(text) {
  17135.             var translator = Zotero.loadTranslator("import");
  17136.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17137.             translator.setString(text);
  17138.             translator.setHandler("itemDone", function(obj, item) {
  17139.                 item.DOI = DOI;
  17140.                 item.publicationTitle = "Journal of Vision";
  17141.                 item.attachments = [{url:PDF, title:"Journal of Vision Full Text PDF", mimeType:"application/pdf"}];
  17142.                 item.complete();
  17143.             });
  17144.             translator.translate();
  17145.         });
  17146.     }, function() {Zotero.done;});
  17147. }');
  17148.  
  17149. REPLACE INTO translators VALUES ('966a7612-900c-42d9-8780-2a3247548588', '1.0.0b4.r5', '', '2008-01-25 20:00:00', '0', '100', '4', 'eMJA', 'Michael Berkowitz', 'http://www.mja.com.au/', 
  17150. 'function detectWeb(doc, url) {
  17151.     if (doc.evaluate(''//p[@class="Pfoot"]/b/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''/html/body/table/tbody/tr[1]/td[2]/a/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17152.         return "multiple";
  17153.     } else if (doc.title.indexOf("eMJA:") != -1) {
  17154.         return "journalArticle";
  17155.     }
  17156. }', 
  17157. 'function senCase(string) {
  17158.     var smallwords = Array("and", "a", "in", "the", "by", "of", "s", "on");
  17159.     var sen = string.split(/\b/);
  17160.     for (var i = 0 ; i < sen.length; i++) {
  17161.         if (sen[i].match(/\w+/)) {
  17162.             if (smallwords.indexOf(sen[i]) != -1 && i != 0) {
  17163.                 sen[i] = sen[i].toLowerCase();
  17164.             } else {
  17165.                 sen[i] = sen[i][0].toUpperCase() + sen[i].substring(1).toLowerCase();
  17166.             }
  17167.         }
  17168.     }
  17169.     return sen.join("");
  17170. }
  17171.  
  17172. function doWeb(doc, url) {
  17173.     var URIs = new Array();
  17174.     
  17175.     if (doc.evaluate(''//p[@class="Pfoot"]/b/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17176.         var xpath = ''//p[@class="Pfoot"]/b/a'';
  17177.     } else if (doc.evaluate(''//tr[1]/td[2]/a/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17178.         var xpath = ''//tr[1]/td[2]/a/b'';
  17179.         var linkpath = ''//tr[2]/td[2]/small[@class="gr"]'';
  17180.     }
  17181.     
  17182.     if (xpath) {
  17183.         if (linkpath) {
  17184.             var items = new Object();
  17185.             var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  17186.             var links = doc.evaluate(linkpath, doc, null, XPathResult.ANY_TYPE, null);
  17187.             var title = titles.iterateNext();
  17188.             var link = links.iterateNext();
  17189.             while (title) {
  17190.                 //Zotero.debug(Zotero.Utilities.cleanString(title.textContent));
  17191.                 //Zotero.debug(Zotero.Utilities.cleanString(link.textContent));
  17192.                 items[Zotero.Utilities.cleanString(link.textContent)] = Zotero.Utilities.cleanString(title.textContent).substring(6);
  17193.                 title = titles.iterateNext();
  17194.                 link = links.iterateNext();
  17195.             }
  17196.         } else {
  17197.             var items = new Object();
  17198.             var things = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  17199.             var next_thing = things.iterateNext();
  17200.             while (next_thing) {
  17201.                 items[next_thing.href] = senCase(Zotero.Utilities.cleanString(next_thing.textContent));
  17202.                 next_thing = things.iterateNext();
  17203.             }
  17204.         }
  17205.         items = Zotero.selectItems(items);
  17206.         Zotero.debug(items);
  17207.         for (var i in items) {
  17208.             URIs.push(i);
  17209.         }
  17210.     } else {
  17211.         URIs.push(url);
  17212.     }
  17213.     Zotero.debug(URIs);
  17214.     Zotero.Utilities.processDocuments(URIs, function(newDoc) {
  17215.         var newItem = new Zotero.Item("journalArticle");
  17216.         newItem.title = senCase(newDoc.title.substring(6));
  17217.         
  17218.         newItem.publicationTitle = "The Medical Journal of Australia";
  17219.         newItem.ISSN = "0025-729X";
  17220.         newItem.url = newDoc.location.href;
  17221.         
  17222.         //date
  17223.         newItem.date = newDoc.evaluate(''//meta[@name="date"]/@content'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substring(0,10);
  17224.         
  17225.         //voliss
  17226.         var voliss = newDoc.evaluate(''//meta[@name="citation"]/@content'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  17227.         //voliss = voliss.match(/[^\d]+(\d+)\s+\((\d+)\)/);
  17228.         voliss = voliss.match(/;\s+(\d+)\s+\((\d+)[^:]+:\s+(.*)\.$/);
  17229.         newItem.volume = voliss[1];
  17230.         newItem.issue = voliss[2];
  17231.         newItem.pages = voliss[3];
  17232.         
  17233.         //authors
  17234.         var authors = new Array();
  17235.         var apath = ''//div[@class="By"]/span[@class="Pn"]'';
  17236.         var author = newDoc.evaluate(apath, newDoc, null, XPathResult.ANY_TYPE, null);
  17237.         var next_a = author.iterateNext();
  17238.         while (next_a) {
  17239.             var name = next_a.textContent;
  17240.             if (name.substring(0,1) == ",") {
  17241.                 name = name.substring(2);
  17242.             } else if (name.substring(0,4) == " and") {
  17243.                 name = name.substring(5);
  17244.             }
  17245.             authors.push(name);
  17246.             next_a = author.iterateNext();
  17247.         }
  17248.         
  17249.         for (var i in authors) {
  17250.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  17251.         }
  17252.         
  17253.         //attachments
  17254.         newItem.attachments = [
  17255.             {url:newDoc.location.href, title:"eMJA Snapshot", mimeType:"text/html"},
  17256.             {url:newDoc.location.href.replace(".html", ".pdf") , title:"eMJA PDF", mimeType:"application/pdf"}
  17257.         ];
  17258.         newItem.complete();
  17259.     }, function() {Zotero.done;});
  17260. }');
  17261.  
  17262. REPLACE INTO translators VALUES ('303c2744-ea37-4806-853d-e1ca67be6818', '1.0.0b4.r5', '', '2008-04-23 09:45:00', '1', '100', '4', 'CSIRO Publishing', 'Michael Berkowitz', 'http://(www.)?publish.csiro.au/', 
  17263. 'function detectWeb(doc, url) {
  17264.     if (doc.evaluate(''//a[@class="searchBoldBlue"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//a[@class="linkjournal"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17265.         return "multiple";
  17266.     } else if (url.indexOf("/view/journals/") != -1 || url.indexOf("paper") != -1) {
  17267.         return "journalArticle";
  17268.     }
  17269. }', 
  17270. 'function doWeb(doc, url) {
  17271.     var links = new Array();
  17272.     if (detectWeb(doc, url) == "multiple") {
  17273.         var items = new Object();
  17274.         if (doc.evaluate(''//a[@class="searchBoldBlue"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17275.             var arts = doc.evaluate(''//a[@class="searchBoldBlue"]'', doc, null, XPathResult.ANY_TYPE, null);
  17276.             var art = arts.iterateNext();
  17277.             while (art) {
  17278.                 items[art.href] = art.textContent;
  17279.                 art = arts.iterateNext();
  17280.             }
  17281.         } else if (doc.evaluate(''//a[@class="linkjournal"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17282.             var arts = doc.evaluate(''//a[@class="linkjournal"]'', doc, null, XPathResult.ANY_TYPE, null);
  17283.             var titles = doc.evaluate(''//td[3]//td[1]/table/tbody/tr/td/b'', doc, null, XPathResult.ANY_TYPE, null);
  17284.             var art;
  17285.             var title;
  17286.             while ((art = arts.iterateNext()) && (title = titles.iterateNext())) {
  17287.                 items[art.href] = title.textContent;
  17288.             }
  17289.         }
  17290.         items = Zotero.selectItems(items);
  17291.         for (var i in items) {
  17292.             links.push(i.match(/([^/=.htm]*)(.htm)?$/)[1]);
  17293.         }
  17294.     } else {
  17295.         links.push(url.match(/([^/=.htm]*)(.htm)?$/)[1]);
  17296.     }
  17297.     for (var i in links) {
  17298.         var newURL = ''http://www.publish.csiro.au/view/journals/dsp_journal_retrieve_citation.cfm?ct='' + links[i] + ''.ris'';
  17299.         var pdfURL = ''http://www.publish.csiro.au/?act=view_file&file_id='' + links[i] + ''.pdf'';
  17300.         Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  17301.             var translator = Zotero.loadTranslator("import");
  17302.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17303.             translator.setString(text);
  17304.             translator.setHandler("itemDone", function(obj, item) {
  17305.                 item.itemType = "journalArticle";
  17306.                 if (item.notes[0]) {
  17307.                     item.abstractNote = item.notes[0].note;
  17308.                 }
  17309.                 item.attachments = [
  17310.                     {url:pdfURL, title:"CSIRO Publishing PDF", mimeType:"application/pdf"},
  17311.                     {url:newURL, title:"CSIRO Publishing Snaphost", mimeType:"text/html"}
  17312.                 ];
  17313.                 item.complete();
  17314.             });
  17315.             translator.translate();
  17316.         });
  17317.     }
  17318.     Zotero.wait();
  17319. }');
  17320.  
  17321. REPLACE INTO translators VALUES ('27ee5b2c-2a5a-4afc-a0aa-d386642d4eed', '1.0.0b4.r5', '', '2008-08-06 17:00:00', '1', '100', '4', 'PubMed Central', 'Michael Berkowitz', 'http://[^/]*.nih.gov/', 
  17322. 'function detectWeb(doc, url) {
  17323.     if (doc.evaluate(''//table[@id="ResultPanel"]//td[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17324.         return "multiple";
  17325.     } else if (url.indexOf("articlerender") != -1) {
  17326.         return "journalArticle";
  17327.     }
  17328. }', 
  17329. 'function doWeb(doc, url) {
  17330.     var tagMap = {journal_title:"publicationTitle",
  17331.                     title:"title",
  17332.                     date:"date",
  17333.                     issue:"issue",
  17334.                     volume:"volume",
  17335.                     doi:"DOI",
  17336.                     fulltext_html_url:"url"
  17337.                 }
  17338.     var URIs = new Array();
  17339.     var items = new Object();
  17340.     if (doc.title.indexOf("PMC Results") != -1) {
  17341.         var titlex = ''//div[@class="toc-entry"]/div/div[@class="toc-title"]'';
  17342.         var linkx = ''//div[@class="toc-entry"]/div/a[@class="toc-link"][1]'';
  17343.         
  17344.         var titles = doc.evaluate(titlex, doc, null, XPathResult.ANY_TYPE, null);
  17345.         var next_title = titles.iterateNext();
  17346.         var links = doc.evaluate(linkx, doc, null, XPathResult.ANY_TYPE, null);
  17347.         var next_link = links.iterateNext();
  17348.         while (next_title && next_link) {
  17349.             items[next_link.href] = next_title.textContent;
  17350.             next_title = titles.iterateNext();
  17351.             next_link = links.iterateNext();
  17352.         }
  17353.         items = Zotero.selectItems(items);
  17354.         for (var i in items) {
  17355.             URIs.push(i);
  17356.         }
  17357.     } else {
  17358.         URIs.push(url);
  17359.     }
  17360.     for each (var link in URIs) {
  17361.         Zotero.Utilities.HTTP.doGet(link, function(text) {
  17362.             var tags = new Object();
  17363.             var meta = text.match(/<meta[^>]*>/gi);
  17364.             for (var i in meta) {
  17365.                 var item = meta[i].match(/=\"([^"]*)\"/g);
  17366.                 if (item[0].substring(2, 10) == ''citation'') {
  17367.                     tags[item[0].substring(11, item[0].length - 1)] = item[1].substring(2, item[1].length - 1);
  17368.                 }
  17369.             }
  17370.             var newItem = new Zotero.Item("journalArticle");
  17371.             for (var tag in tagMap) {
  17372.                 newItem[tagMap[tag]] = Zotero.Utilities.unescapeHTML(tags[tag]);
  17373.             }
  17374.             for (var i in meta) {
  17375.                 if (meta[i].match(/DC.Contributor/)) {
  17376.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.unescapeHTML(meta[i].match(/content=\"([^"]*)\">/)[1]), "author"));
  17377.                 }
  17378.             }
  17379.             newItem.attachments.push({url:tags["fulltext_html_url"], title:"PubMed Central Snapshot", mimeType:"text/html"});
  17380.             if (tags["pdf_url"]) {    
  17381.                 newItem.attachments.push({url:tags["pdf_url"], title:"PubMed Central Full Text PDF", mimeType:"application/pdf"});
  17382.             }
  17383.             newItem.url = tags["fulltext_html_url"];
  17384.             if (!newItem.url) newItem.url = tags["abstract_html_url"];
  17385.             newItem.extra = text.match(/PMC\d+/)[0];
  17386.             newItem.journalAbbreviation = text.match(/span class=\"citation-abbreviation\">([^<]+)</)[1];
  17387.             newItem.pages = text.match(/span class=\"citation-flpages\">([^<]+)</)[1].replace(/[\.:\s]/g, "");
  17388.             
  17389.             if (text.match(/Abstract<\/div>([^<]+)</)) {
  17390.                 var abstract = text.match(/Abstract<\/div>([^<]+)</)[1];
  17391.             } else if (text.match(/\"section-content\"><!\-\-article\-meta\-\->([^<]+)/)) {
  17392.                 var abstract = text.match(/\"section-content\"><!\-\-article\-meta\-\->([^<]+)/)[1];
  17393.             }
  17394.             if (abstract) newItem.abstractNote = abstract;
  17395.             newItem.complete();
  17396.         });
  17397.     }
  17398.     Zotero.wait();
  17399. }');
  17400.  
  17401. REPLACE INTO translators VALUES ('60d97c99-47f0-4323-98b6-5699faf827b1', '1.0.0b4.r5', '', '2008-01-09 20:00:00', '0', '100', '4', 'Blackwell Compass', 'Michael Berkowitz', 'http://www.blackwell-compass.com/subject/[^/]+/.+', 
  17402. 'function detectWeb(doc, url) {
  17403.     if (url.indexOf("search_results") != -1 || url.indexOf("section_home") != -1) {
  17404.         return "multiple";
  17405.     } else {
  17406.         return "journalArticle";
  17407.     }
  17408. }', 
  17409. 'function doWeb(doc, url) {
  17410.     var namespace = doc.documentElement.namespaceURI;
  17411.     var nsResolver = namespace ? function(prefix) {
  17412.         if (prefix == ''x'') return namespace; else return null;
  17413.     } : null;
  17414.     
  17415.     var URIs = new Array();
  17416.     var items = new Object();
  17417.     if (detectWeb(doc, url) == "multiple") {
  17418.         
  17419.         var xpath = ''//div[@class="article-holder"]//h4[@class="article"]/a'';
  17420.         var articles = doc.evaluate(xpath, doc, namespace, XPathResult.ANY_TYPE, null);
  17421.         var next_art = articles.iterateNext();
  17422.         while (next_art) {
  17423.             items[next_art.href] = next_art.textContent;
  17424.             next_art = articles.iterateNext();
  17425.         }
  17426.         items = Zotero.selectItems(items);
  17427.         
  17428.         for (var i in items) {
  17429.             URIs.push(i);
  17430.         }
  17431.     } else {
  17432.         URIs.push(url);
  17433.     }
  17434.     
  17435.     Zotero.Utilities.processDocuments(URIs, function(doc, urll) {
  17436.         var doi = doc.evaluate(''//div[@id="content"]/p/span[@class="guide"]/a[substring(@href, 1, 4) = "http"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/doi\/[^/]*\/([^&]*)/)[1];
  17437.         Zotero.Utilities.HTTP.doGet(''http://www.blackwell-synergy.com/action/downloadCitation?doi='' + doi + ''&include=cit&format=refman&direct=on&submit=Download+references'', function(text) {
  17438.             var translator = Zotero.loadTranslator("import");
  17439.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17440.             translator.setString(text);
  17441.             translator.setHandler("itemDone", function(obj, item) {
  17442.                 item.attachments = [
  17443.                     {url:item.url, title:"Blackwell Compass Snapshot", mimeType:"text/html"},
  17444.                     {url:item.url.replace("/doi/abs", "/doi/pdf"), title:"Blackwell Compass Full Text PDF", mimeType:"application/pdf"}
  17445.                 ];
  17446.                 
  17447.                 item.complete();
  17448.         
  17449.             });
  17450.             
  17451.             translator.translate();
  17452.         });
  17453.     }, function() {Zotero.done;});
  17454.     Zotero.wait();
  17455. }');
  17456.  
  17457. REPLACE INTO translators VALUES ('ca6e95d1-46b9-4535-885c-df0c2d4b7f7a', '1.0.0b4.r5', '', '2008-01-07 19:00:00', '0', '100', '4', 'Innovate Online', 'Michael Berkowitz', '^http://(www.)?innovateonline.info/', 
  17458. 'function detectWeb(doc, url) {
  17459.     if (url.indexOf("view=article") != -1) {
  17460.         return "journalArticle";
  17461.     } else if (url.indexOf("view=search") != -1) {
  17462.         return "multiple";
  17463.     }
  17464. }', 
  17465. 'function doWeb(doc, url) {
  17466.     var namespace = doc.documentElement.namespaceURI;
  17467.     var nsResolver = namespace ? function(prefix) {
  17468.         if (prefix == ''x'') return namespace; else return null;
  17469.     } : null;
  17470.     var newURIs = new Array();
  17471.     
  17472.     if (url.indexOf("view=search") != -1) {
  17473.         var titles = new Array();
  17474.         var hrefs = new Array();
  17475.         var items = new Object();
  17476.         var xpath = ''//ul[@class="articles"]/li[@class="result"]/div[@class="header"]'';
  17477.         var names = doc.evaluate(xpath, doc, namespace, XPathResult.ANY_TYPE, null);
  17478.         var next_item = names.iterateNext();
  17479.         while (next_item) {
  17480.             titles.push(next_item.textContent.split(/\n/)[3]);
  17481.             next_item = names.iterateNext();
  17482.         }
  17483.         
  17484.         var nextpath = ''//ul[@class="articles"]/li/@onclick'';
  17485.         var links = doc.evaluate(nextpath, doc, namespace, XPathResult.ANY_TYPE, null);
  17486.         var next_link = links.iterateNext();
  17487.         while (next_link) {
  17488.             hrefs.push(next_link.textContent);
  17489.             next_link = links.iterateNext();
  17490.         }
  17491.     
  17492.         for (var i = 0 ; i < titles.length ; i++) {
  17493.             items[hrefs[i].match(/\d+/)] = titles[i];
  17494.         }
  17495.         items = Zotero.selectItems(items);
  17496.         
  17497.         for (var i in items) {
  17498.             newURIs.push(''http://innovateonline.info/index.php?view=article&id='' + i);
  17499.         }
  17500.     } else {
  17501.         var newURL = url;
  17502.         if (newURL.indexOf("highlight") != -1) {
  17503.             newURL = newURL.substring(0, newURL.indexOf("highlight") -1);
  17504.         }
  17505.         if (newURL.indexOf("action=synopsis") != -1) {
  17506.             newURL = newURL.replace("action=synopsis", "action=article");
  17507.         }
  17508.         newURIs.push(newURL);
  17509.     }
  17510.     Zotero.debug(newURIs);
  17511.     
  17512.     Zotero.Utilities.processDocuments(newURIs, function(newDoc) {
  17513.         var newItem = new Zotero.Item("journalArticle");
  17514.         newItem.repository = "Innovate Online";
  17515.         newItem.publicationTitle = "Innovate";
  17516.         newItem.title = newDoc.title.substring(10);
  17517.         
  17518.         var authors = newDoc.evaluate(''//div[@id="title"]/div[@class="author"]/a'', newDoc, namespace, XPathResult.ANY_TYPE, null);
  17519.         var author = authors.iterateNext();
  17520.         while (author) {
  17521.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author"));
  17522.             author = authors.iterateNext();
  17523.         }
  17524.         
  17525.         newItem.date = newDoc.evaluate(''//div[@id="page"]/a/div[@class="title"]'', newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  17526.         
  17527.         var voliss = newDoc.evaluate(''//div[@id="page"]/a/div[@class="subtitle"]'', newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Volume\s+(\d+).*Issue\s+(\d+)/);
  17528.         newItem.volume = voliss[1];
  17529.         newItem.issue = voliss[2];
  17530.         
  17531.         var id = newDoc.location.href.match(/\d+/)[0];
  17532.         var PDFurl = "http://innovateonline.info/print.php?view=pdf&id=" + id;
  17533.         newItem.attachments = [
  17534.             {url:newDoc.location.href, title:"Innovate Online Snapshot", mimeType:"text/html"},
  17535.             {url:PDFurl, title:"Innovate Online PDF", mimeType:"application/pdf"}
  17536.         ]
  17537.         
  17538.         Zotero.Utilities.HTTP.doGet(newDoc.location.href.replace("action=article", "action=synopsis"), function(text) {
  17539.             var abs = text.match(/<div id=\"synopsis\">\n<p>(.*)<\/p>/)[1];
  17540.             newItem.abstractNote = Zotero.Utilities.unescapeHTML(Zotero.Utilities.cleanTags(abs));
  17541.             newItem.complete();
  17542.         });
  17543.     }, function() {Zotero.done;});
  17544.     Zotero.wait();
  17545. }');
  17546.  
  17547. REPLACE INTO translators VALUES ('bdae838b-3a58-461f-9e8a-142ed9de61dc', '1.0.0b4.r5', '', '2008-04-02 08:10:00', '1', '100', '4', 'PLoS Biology and Medicine', 'Michael Berkowitz', 'http://[^.]+\.plosjournals\.org/', 
  17548. 'function detectWeb(doc, url)    {
  17549.     if (doc.evaluate(''//div[@class="search"][@id="browseResults"]/ul/li/span/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
  17550.         doc.evaluate(''//div[@id="toclist"]/dl/dt/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17551.         return "multiple";
  17552.     } else if (url.indexOf("get-document") != -1) {
  17553.         return "journalArticle";
  17554.     }
  17555. }', 
  17556. 'function unescape(text)    {
  17557.     var specialreg=new RegExp("&#[^;]+;");
  17558.     var specials=specialreg.exec(text);
  17559.     while(specials)    {
  17560.         text=text.replace(specials[0], String.fromCharCode(parseInt(specials[0].substring(2, specials[0].length-1), 10)));
  17561.         specials=specialreg.exec(text);
  17562.     }
  17563.     return text;
  17564. }
  17565.  
  17566. function doWeb(doc, url) {
  17567.     var URLs = new Array();
  17568.     var items = new Object();
  17569.     if (detectWeb(doc, url) == "multiple") {
  17570.         if (doc.evaluate(''//div[@class="search"][@id="browseResults"]/ul/li/span/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17571.             var xpath = ''//div[@class="search"][@id="browseResults"]/ul/li/span/a'';
  17572.         } else if (doc.evaluate(''//div[@id="toclist"]/dl/dt/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17573.             var xpath = ''//div[@id="toclist"]/dl/dt/a'';
  17574.         }
  17575.         var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  17576.         var next_article = articles.iterateNext();
  17577.         while (next_article) {
  17578.             items[next_article.href] = Zotero.Utilities.cleanString(next_article.textContent);
  17579.             next_article = articles.iterateNext();
  17580.         }
  17581.         items = Zotero.selectItems(items);
  17582.         
  17583.         if (!items) {
  17584.             return true;
  17585.         }
  17586.         
  17587.         for (var i in items) {
  17588.             URLs.push(i);
  17589.         }
  17590.     } else {
  17591.         URLs.push(url);
  17592.     }
  17593.     
  17594.     
  17595.     Zotero.Utilities.processDocuments(URLs, function(doc, url) {
  17596.         var bits = doc.location.href.match(/(^.*\?request=).*(doi=.*$)/);
  17597.         var RISurl = bits[1] + ''download-citation&t=refman&'' + bits[2];
  17598.         Zotero.Utilities.HTTP.doGet(RISurl, function(text) {
  17599.             var trans=Zotero.loadTranslator("import");
  17600.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17601.             trans.setString(text);
  17602.             trans.setHandler("itemDone", function(obj, newItem)    {
  17603.                 var urlstring= bits[1]+ ''get-pdf&'' +bits[2].replace("doi=", "file=").replace("/", "_").replace("%2F", "_") + ''-S.pdf'';
  17604.                 newItem.attachments.push({url:urlstring, title:newItem.title, mimeType:"application/pdf"});
  17605.                 
  17606.                 var urlRE = /http:\/\/dx.doi.org\/(.*)$/;
  17607.                 if (newItem.url) {
  17608.                     newItem.DOI = newItem.url.match(urlRE)[1].replace("%2F", "/");
  17609.                 }
  17610.                 
  17611.                 newItem.complete();
  17612.             });
  17613.             trans.translate();
  17614.             Zotero.done();
  17615.         });
  17616.         Zotero.wait();
  17617.     }, function() {Zotero.done;});
  17618.     
  17619.     Zotero.wait();
  17620. }');
  17621.  
  17622. REPLACE INTO translators VALUES ('9575e804-219e-4cd6-813d-9b690cbfc0fc', '1.0.0b4.r5', '', '2008-04-02 08:30:00', '1', '100', '4', 'PLoS Journals', 'Michael Berkowitz', 'http://www\.plos(one|ntds|compbiol|pathogens|genetics)\.org/(search|article)/', 
  17623. 'function detectWeb(doc, url) {
  17624.     if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) {
  17625.         return "multiple";
  17626.     } else if (url.indexOf("article") != -1) {
  17627.         return "journalArticle";
  17628.     }
  17629. }', 
  17630. 'function doWeb(doc, url) {
  17631.     var items = new Object();
  17632.     var texts = new Array();
  17633.     if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) {
  17634.         var articlex = ''//span[@class="article"]/a'';
  17635.         var articles = doc.evaluate(articlex, doc, null, XPathResult.ANY_TYPE, null);
  17636.         var next_art = articles.iterateNext();
  17637.         while (next_art) {
  17638.             items[next_art.href] = next_art.textContent;
  17639.             next_art = articles.iterateNext();
  17640.         }
  17641.         items = Zotero.selectItems(items);
  17642.         for (var i in items) {
  17643.             texts.push(i);
  17644.         }
  17645.     } else {
  17646.         texts.push(url);
  17647.     }
  17648.     Zotero.Utilities.processDocuments(texts, function(newDoc, url) {
  17649.         var doi = newDoc.location.href.match(/doi(\/|%2F)(.*)$/)[2];
  17650.         var newURL = newDoc.location.href.replace("info", "getRisCitation.action?articleURI=info");
  17651.         var pdfURL = newDoc.location.href.replace("info", "fetchObjectAttachment.action?uri=info") + ''&representation=PDF'';
  17652.         Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  17653.             var translator = Zotero.loadTranslator("import");
  17654.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17655.             translator.setString(text);
  17656.             translator.setHandler("itemDone", function(obj, item) {
  17657.                 item.attachments.push({url:pdfURL, title:"PLoS One Full Text PDF", mimeType:"application/pdf"});
  17658.                 item.DOI = doi;
  17659.                 item.repository = item.publicationTitle;
  17660.                 item.complete();
  17661.             });
  17662.             translator.translate();
  17663.         });    
  17664.     }, function() {Zotero.done;});
  17665.     Zotero.wait();
  17666. }');
  17667.  
  17668. REPLACE INTO translators VALUES ('b86bb082-6310-4772-a93c-913eaa3dfa1b', '1.0.0b4.r5', '', '2008-02-11 19:30:00', '0', '100', '4', 'Early English Books Online', 'Michael Berkowitz', 'http://[^/]*eebo.chadwyck.com[^/]*/search', 
  17669. 'function detectWeb(doc, url) {
  17670.     if (doc.title == "Search Results - EEBO") {
  17671.         return "multiple";
  17672.     } else if (doc.title != "Basic Search - EEBO") {
  17673.         return "book";
  17674.     }
  17675. }', 
  17676. 'function doWeb(doc, url) {
  17677.     var eeboIDs = new Array();
  17678.     
  17679.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  17680.     var hMatch = hostRegexp.exec(url);
  17681.     var host = hMatch[1];
  17682.  
  17683.     if (doc.title == "Search Results - EEBO") {
  17684.         var items = new Object();
  17685.         Zotero.debug("search page");
  17686.         var IDxpath = ''//td[3]/script'';
  17687.         var Titlexpath = ''//td[3]/i'';
  17688.         var new_ids = doc.evaluate(IDxpath, doc, null, XPathResult.ANY_TYPE, null);
  17689.         var new_titles = doc.evaluate(Titlexpath, doc, null, XPathResult.ANY_TYPE, null);
  17690.         var next_id = new_ids.iterateNext();
  17691.         var next_title = new_titles.iterateNext();
  17692.         var IDRegex = /''(\d+)''/;
  17693.         while (next_id) {
  17694.             items[next_id.textContent.match(IDRegex)[1]] = next_title.textContent;
  17695.             next_id = new_ids.iterateNext();
  17696.             next_title = new_titles.iterateNext();
  17697.         }
  17698.         items = Zotero.selectItems(items);
  17699.         for (var i in items) {
  17700.             eeboIDs.push(i);
  17701.         }
  17702.     } else {
  17703.         var IDRegex = /&ID=(\w+)&/
  17704.         var eeboid = url.match(IDRegex)[1];
  17705.         if (eeboid[0] == "D") {
  17706.             eeboid = eeboid.slice(7, 14);
  17707.         }
  17708.         eeboIDs.push(eeboid);
  17709.     }
  17710.     Zotero.debug(eeboIDs);
  17711.     for (var i = 0 ; i < eeboIDs.length ; i++) {
  17712.         var postString = ''cit_format=RIS&Print=Print&cit_eeboid='' + eeboIDs[i] + ''&EeboId='' + eeboIDs[i];
  17713.         var new_eeboid = eeboIDs[i]
  17714.         Zotero.Utilities.HTTP.doPost(host+''/search/print'', postString, function(text) {
  17715.             // load translator for RIS
  17716.             var translator = Zotero.loadTranslator("import");
  17717.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  17718.             translator.setString(text.substring(17));
  17719.             translator.setHandler("itemDone", function(obj, item) {
  17720.                 item.url = host+''/search/full_rec?SOURCE=pgimages.cfg&ACTION=ByID&ID='' + new_eeboid + ''&FILE=../session/1190302085_15129&SEARCHSCREEN=CITATIONS&SEARCHCONFIG=config.cfg&DISPLAY=ALPHA'';
  17721.                 item.complete();
  17722.             });
  17723.             translator.translate();
  17724.             Zotero.done();
  17725.         });
  17726.     }
  17727. }');
  17728.  
  17729. REPLACE INTO translators VALUES ('d9be934c-edb9-490c-a88d-34e2ee106cd7', '1.0.0b4.r5', '', '2008-08-04 07:10:00', '0', '100', '4', 'Time.com', 'Michael Berkowitz', 'http://www.time.com/time/', 
  17730. 'function detectWeb(doc, url) {
  17731.     if (doc.title == "TIME Magazine - Search Results") {
  17732.         return "multiple";
  17733.     } else {
  17734.         var namespace = doc.documentElement.namespaceURI;
  17735.         var nsResolver = namespace ? function(prefix) {
  17736.             if (prefix == "x") return namespace; else return null;
  17737.         } : null;
  17738.         
  17739.         var xpath = ''//meta[@name="byline"]'';
  17740.         var xpath2 = ''//div[@class="byline"]'';
  17741.         var xpath3 = ''//div[@class="copy"]/div[@class="byline"]'';
  17742.         if ((doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(xpath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(xpath3, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) ) {
  17743.             if (url.substr(-4,4) == "html") {
  17744.                 return "magazineArticle";
  17745.             }
  17746.         }
  17747.     }
  17748. }
  17749. ', 
  17750. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  17751.     if (metaTags[field]) {
  17752.         newItem[zoteroField] = Zotero.Utilities.trimInternal(metaTags[field]);
  17753.     }
  17754. }
  17755.  
  17756. function scrape(doc, url) {
  17757.     var newItem = new Zotero.Item("magazineArticle");
  17758.     newItem.publicationTitle = "Time";
  17759.     newItem.ISSN = "0040-718X";
  17760.     newItem.url = doc.location.href;
  17761.     var metaTags = new Object();
  17762.     
  17763.     var metaTagHTML = doc.getElementsByTagName("meta")
  17764.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  17765.         metaTags[metaTagHTML[i].getAttribute("name")] = metaTagHTML[i].getAttribute("content");
  17766.     }
  17767.     
  17768.     if (metaTags["head"]) {
  17769.         associateMeta(newItem, metaTags, "head", "title");
  17770.     } else  if (doc.title.length > 7) {
  17771.         newItem.title = doc.title.substr(0, doc.title.length - 7); 
  17772.     } else {
  17773.         newItem.title = "No Title";
  17774.     }
  17775.     
  17776.     if (metaTags["description"]) {
  17777.         associateMeta(newItem, metaTags, "description", "abstractNote");
  17778.     }
  17779.     
  17780.      if (metaTags["date"]) {
  17781.          var date = metaTags["date"];
  17782.          var months = new Object();
  17783.              months["jan"] = "January";
  17784.              months["feb"] = "February";
  17785.              months["mar"] = "March";
  17786.              months["apr"] = "April";
  17787.              months["may"] = "May";
  17788.              months["jun"] = "June";
  17789.              months["jul"] = "July";
  17790.              months["aug"] = "August";
  17791.              months["sep"] = "September";
  17792.              months["oct"] = "October";
  17793.              months["nov"] = "November";
  17794.              months["dec"] = "December";
  17795.          date = date.split(".").join("").split(", ").slice(1);
  17796.          date[0] = months[date[0].split(" ")[0].toLowerCase()] + " " + date[0].split(" ")[1];
  17797.          newItem.date = date.join(", ");
  17798.      }
  17799.     if (metaTags["keywords"]) {
  17800.         newItem.tags = Zotero.Utilities.trimInternal(metaTags["keywords"]).split(", ");
  17801.         for (var i in newItem.tags) {
  17802.             if (newItem.tags[i] == "" || newItem.tags[i] == " ") {
  17803.                 break;
  17804.             } else {
  17805.                 var words = newItem.tags[i].split(" ");
  17806.                 for (var j = 0 ; j < words.length ; j++) {
  17807.                     Zotero.debug(words[j]);
  17808.                     if (words[j][0] == words[j][0].toLowerCase() && words[j][0]) {
  17809.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  17810.                     }
  17811.                 }
  17812.             } 
  17813.             newItem.tags[i] = words.join(" ");
  17814.         }
  17815.     }
  17816.     
  17817.     if (metaTags["byline"]) {
  17818.         var byline = Zotero.Utilities.trimInternal(metaTags["byline"]);
  17819.         var byline1 = byline.split(" and ");
  17820.         for (var i = 0 ; i < byline1.length ; i++) {
  17821.             var byline2 = byline1[i].split("/");
  17822.             for (var j = 0 ; j < byline2.length ; j++) {
  17823.                 byline2[j] = Zotero.Utilities.trimInternal(byline2[j]);
  17824.                 if (byline2[j].indexOf(" ") == -1) {
  17825.                     if (byline2[j].length == 2) {
  17826.                         newItem.extra = byline2[j];
  17827.                     } else {
  17828.                         newItem.extra = byline2[j][0].toUpperCase() + byline2[j].substr(1).toLowerCase();
  17829.                     }
  17830.                 } else {
  17831.                     byline3 = byline2[j].split(" ");
  17832.                     for (var x = 0 ; x < byline3.length ; x++) {
  17833.                         byline3[x] = byline3[x][0].toUpperCase() + byline3[x].substr(1).toLowerCase();
  17834.                     }
  17835.                     byline3 = byline3.join(" ");
  17836.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(byline3, "author"));
  17837.                 }
  17838.             }
  17839.         }
  17840.     }
  17841.     newItem.attachments.push({document:doc, title:doc.title});
  17842.     newItem.complete();
  17843. }
  17844.  
  17845.  
  17846. function doWeb(doc, url) {
  17847.     var namespace = doc.documentElement.namespaceURI;
  17848.     var nsResolver = namespace ? function(prefix) {
  17849.         if (prefix == "x") return namespace; else return null;
  17850.     } : null;
  17851.     
  17852.     var urls = new Array();
  17853.     if (doc.title == "TIME Magazine - Search Results") {
  17854.         var items = new Array();
  17855.         var items = Zotero.Utilities.getItemArray(doc, doc.getElementById("search_results").getElementsByTagName("h3"), ''^http://www.time.com/time/.*\.html$'');
  17856.  
  17857.         items = Zotero.selectItems(items);
  17858.     
  17859.         if (!items) {
  17860.             return true;
  17861.         }
  17862.         
  17863.         for (var i in items) {
  17864.             if (i.match("covers") == null) {
  17865.                 urls.push(i);
  17866.             }
  17867.         }
  17868.     } else if (doc.evaluate(''//meta[@name="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//div[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//div[@class="copy"]/div[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  17869.         urls.push(doc.location.href);
  17870.     }
  17871.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  17872.         scrape(newDoc);
  17873.     }, function() { Zotero.done; } );
  17874.     Zotero.wait();
  17875. }');
  17876.  
  17877. REPLACE INTO translators VALUES ('b33bbb49-03d2-4175-91c4-3840501bc953', '1.0.0b4.r5', '', '2007-07-31 16:45:00', '1', '100', '4', 'Time-Blog.com', 'Michael Berkowitz', '^http://time-blog.com/', 
  17878. 'function detectWeb(doc, url) {
  17879.     if (url.substr(-4,4) == "html") {
  17880.         return "blogPost";
  17881.     } else {
  17882.         return "multiple";
  17883.     }
  17884. }', 
  17885. 'function scrape(doc, url) {
  17886.     var newItem = new Zotero.Item("blogPost");
  17887.     
  17888.     newItem.url = doc.location.href;
  17889.     newItem.title = doc.title.substr(0, doc.title.indexOf(" - "));
  17890.     
  17891.     var titleRE = new RegExp(''^http://time-blog.com/([^/]*)/'');
  17892.     var title = titleRE.exec(doc.location.href)[1].split("_");
  17893.     for (var i = 0 ; i < title.length ; i++) {
  17894.         title[i] = title[i][0].toUpperCase() + title[i].substr(1).toLowerCase();
  17895.     }
  17896.     newItem.blogTitle = title.join(" ");
  17897.     var metaTags = new Object();
  17898.     
  17899.     var metaTagHTML = doc.getElementsByTagName("meta");
  17900.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  17901.         metaTags[metaTagHTML[i].getAttribute("name")] = metaTagHTML[i].getAttribute("content");
  17902.     }
  17903.     
  17904.     if (metaTags["description"]) {
  17905.         newItem.abstractNote = Zotero.Utilities.cleanString(Zotero.Utilities.cleanTags(metaTags["description"]));
  17906.     }
  17907.     
  17908.     if (metaTags["date"]) {
  17909.          var date = metaTags["date"];
  17910.          var months = new Object();
  17911.              months["jan"] = "January";
  17912.              months["feb"] = "February";
  17913.              months["mar"] = "March";
  17914.              months["apr"] = "April";
  17915.              months["may"] = "May";
  17916.              months["jun"] = "June";
  17917.              months["jul"] = "July";
  17918.              months["aug"] = "August";
  17919.              months["sep"] = "September";
  17920.              months["oct"] = "October";
  17921.              months["nov"] = "November";
  17922.              months["dec"] = "December";
  17923.          date = date.split(".").join("").split(", ");
  17924.          date[0] = months[date[0].split(" ")[0].toLowerCase()] + " " + date[0].split(" ")[1];
  17925.          newItem.date = date.join(", ");
  17926.      }
  17927.      
  17928.      if (metaTags["keywords"]) {
  17929.         newItem.tags = metaTags["keywords"].split(", ");
  17930.         for (var i in newItem.tags) {
  17931.             if (newItem.tags[i] == "" || newItem.tags[i] == " ") {
  17932.                 break;
  17933.             } else {
  17934.                 var words = newItem.tags[i].split(" ");
  17935.                 for (var j = 0 ; j < words.length ; j++) {
  17936.                     if (words[j][0] == words[j][0].toLowerCase() && words[j][0]) {
  17937.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  17938.                     }
  17939.                 }
  17940.             } 
  17941.             newItem.tags[i] = words.join(" ");
  17942.         }
  17943.     }
  17944.     
  17945.     if (doc.evaluate(''//span[@class="postedby"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  17946.         var byline = Zotero.Utilities.cleanString(doc.evaluate(''//span[@class="postedby"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  17947.         if (byline.substr(0,9).toLowerCase() == "posted by") {
  17948.             byline = byline.substr(10).split(" ");
  17949.         } else {
  17950.             byline.split(" ");
  17951.         }
  17952.         for (var i = 0; i < byline.length ; i++) {
  17953.             byline[i] = byline[i][0].toUpperCase() + byline[i].substr(1).toLowerCase();
  17954.         }
  17955.         newItem.creators.push(Zotero.Utilities.cleanAuthor(byline.join(" "), "author"));
  17956.     } else if (newItem.blogTitle == "Theag") {
  17957.         newItem.creators.push(Zotero.Utilities.cleanAuthor("Matthew Yeomans", "author"));
  17958.         newItem.blogTitle = "the Aggregator";
  17959.     }
  17960.     
  17961.     Zotero.debug(newItem);
  17962.     
  17963.     newItem.complete();
  17964.     
  17965. }
  17966.  
  17967. function doWeb(doc, url) {
  17968.  
  17969.     var namespace = doc.documentElement.namespaceURI;
  17970.     var nsResolver = namespace ? function(prefix) {
  17971.         if (prefix == "x") return namespace; else return null;
  17972.     } : null;
  17973.     
  17974.     var URIS = new Array();
  17975.     
  17976.     var xpath = ''//h1[@class="entryTitle"]/a'';
  17977.     var articles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  17978.     var art = articles.iterateNext();
  17979.     var arts = new Array();
  17980.     var urls = new Array();
  17981.     while (art) {
  17982.          arts.push(art.textContent);
  17983.          urls.push(art.href);
  17984.          art = articles.iterateNext();
  17985.     }
  17986.     if (arts.length > 1) {
  17987.         var items = new Object;
  17988.         for (var i  = 0; i < arts.length ; i++ ) {
  17989.             items[urls[i]] = arts[i];
  17990.         }
  17991.         items = Zotero.selectItems(items);
  17992.     
  17993.         for (i in items) {
  17994.             URIS.push(i);
  17995.         }
  17996.     } else {
  17997.         URIS.push(url);
  17998.     }
  17999.     Zotero.Utilities.processDocuments(URIS, scrape, function() { Zotero.done(); } );
  18000.     
  18001.     Zotero.wait();
  18002. }');
  18003.  
  18004. REPLACE INTO translators VALUES ('9346ddef-126b-47ec-afef-8809ed1972ab', '1.0.0b4.r5', '', '2008-04-28 17:50:00', '1', '99', '4', 'Institute of Physics', 'Michael Berkowitz', '^http://www.iop.org/EJ/(toc|abstract|search|article)', 
  18005. 'function detectWeb(doc, url) {
  18006.     if ((doc.location.href.indexOf("toc") == -1) && (doc.location.href.indexOf("search") == -1)) {
  18007.         return "journalArticle";
  18008.     } else {
  18009.         return "multiple";
  18010.     }
  18011. }', 
  18012. 'function parseRIS(getURL, pdfURL) {   
  18013.     var newGet = getURL.replace(/EJ\/[^/]+/, "EJ/sview") + "?format=refmgr&submit=1";
  18014.     Zotero.Utilities.HTTP.doGet(newGet, function(text){
  18015.         // load translator for RIS
  18016.         var translator = Zotero.loadTranslator ("import");
  18017.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  18018.         translator.setString(text);
  18019.         translator.setHandler("itemDone", function(obj, item) { 
  18020.         item.url = getURL;
  18021.         item.attachments = [
  18022.                 {url:item.url, title:"IOP Snapshot", mimeType:"text/html"}
  18023.             ];
  18024.             if (pdfURL != null) {
  18025.                 item.attachments.push({url:pdfURL, title:"IOP Full Text PDF", mimeType:"application/pdf"});
  18026.             }
  18027.             item.complete();
  18028.     });
  18029.     translator.translate();
  18030.         Zotero.done();
  18031.     }, function() {}); 
  18032.     Zotero.wait();
  18033. }
  18034.  
  18035. function doWeb(doc, url) {
  18036.     var namespace = doc.documentElement.namespaceURI;
  18037.     var nsResolver = namespace ? function(prefix) {
  18038.         if (prefix == "x") return namespace; else return null;
  18039.     } : null;
  18040.     
  18041.     var arts = new Array();
  18042.     if (detectWeb(doc, url) == "multiple") {
  18043.         var items = new Object();
  18044.         var results = doc.evaluate(''//td[*//td[*//a[contains(text(), "Abstract")]]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  18045.         var result;
  18046.         while (result = results.iterateNext()) {
  18047.             var title = doc.evaluate(''.//strong'', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  18048.             var link = doc.evaluate(''.//a[contains(text(), "Abstract")]'', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  18049.             var pdflink = doc.evaluate(''.//a[contains(text(), "PDF")]'', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ? doc.evaluate(''.//a[contains(text(), "PDF")]'', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href : null;
  18050.             var links = new Array(link, pdflink);
  18051.             items[links] = title;
  18052.         }
  18053.         items = Zotero.selectItems(items);
  18054.         for (var i in items) {
  18055.             arts.push(i);
  18056.         }
  18057.     } else {
  18058.         var pdfurl = doc.evaluate(''//a[contains(text(), "PDF")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  18059.         var links = url + '','' + pdfurl;
  18060.         arts = [links];
  18061.     }
  18062.     for each (var linkset in arts) {
  18063.         var urls = linkset.split('','');
  18064.         parseRIS(urls[0], urls[1]);
  18065.     }
  18066. }');
  18067.  
  18068.  
  18069. REPLACE INTO translators VALUES ('6ec8008d-b206-4a4c-8d0a-8ef33807703b', '1.0.0b4.r5', '', '2009-01-12 23:40:00', 1, 100, 4, 'The Economist', 'Michael Berkowitz', '^http://(www.)?economist.com/',
  18070. 'function detectWeb(doc, url) {
  18071.        if (doc.location.href.indexOf("search") != -1) {
  18072.                return "multiple";
  18073.        } else if (doc.location.href.toLowerCase().indexOf("displaystory") != -1 || doc.location.href.indexOf("cityPage") != -1) {
  18074.                return "magazineArticle";
  18075.        }
  18076. }',
  18077. 'function scrape(doc, url) {
  18078.        var namespace = doc.documentElement.namespaceURI;
  18079.        var nsResolver = namespace ? function(prefix) {
  18080.                if (prefix == "x" ) return namespace; else return null;
  18081.        } : null;
  18082.  
  18083.        newItem = new Zotero.Item("magazineArticle");
  18084.        newItem.ISSN = "0013-0613";
  18085.        newItem.url = doc.location.href;
  18086.        newItem.publicationTitle = "The Economist";
  18087.  
  18088.  
  18089.        //get headline
  18090.        var title = new Array();
  18091.        if (doc.title && doc.title != "" && doc.title != "Economist.com") {
  18092.                title = doc.title.split(" | ");
  18093.        } else {
  18094.         title.push(doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/font/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  18095.        }
  18096.  
  18097.  
  18098.        if (title.length == 1) {
  18099.                title.push = title;
  18100.        } else {
  18101.                title = title.slice(0, title.length - 1);
  18102.                title = title.join(": ");
  18103.        }
  18104.        newItem.title = title;
  18105.  
  18106.        if (doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-right"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  18107.                newItem.extra =  "(Subscription only)";
  18108.        }
  18109.  
  18110.        //get abstract
  18111.        if (doc.evaluate(''//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  18112.                newItem.abstractNote = doc.evaluate(''//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  18113.        } else if (doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/p/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  18114.                newItem.abstractNote = doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/p/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  18115.        } else if (doc.evaluate(''//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/p[3]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  18116.                newItem.abstractNote = doc.evaluate(''//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/p[3]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  18117.        }
  18118.        if (newItem.abstractNote) newItem.abstractNote = Zotero.Utilities.trimInternal(newItem.abstractNote);
  18119.        //get date and extra stuff
  18120.        if (doc.evaluate(''//div[@class="col-left"]/p[@class="info"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  18121.                newItem.date = doc.evaluate(''//div[@class="col-left"]/p[@class="info"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(0,13);
  18122.        }
  18123.     
  18124.     var url = doc.location.href;
  18125.        newItem.attachments = [
  18126.                {url:url.replace("displaystory", "PrinterFriendly"), title:"The Economist Snapshot", mimeType:"text/html"}
  18127.            ];
  18128.            
  18129.        newItem.complete();
  18130. }
  18131.  
  18132.  
  18133. function doWeb(doc, url) {
  18134.        var namespace = doc.documentElement.namespaceURI;
  18135.        var nsResolver = namespace ? function(prefix) {
  18136.                if (prefix == "x" ) return namespace; else return null;
  18137.        } : null;
  18138.  
  18139.        var urls = new Array();
  18140.  
  18141.        if (doc.title == "Search | Economist.com") {
  18142.                var items = new Array();
  18143.                var uris = new Array();
  18144.                var results = doc.evaluate(''//ol[@class="search-results"]/li/h2/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  18145.                var headline = results.iterateNext();
  18146.                while (headline) {
  18147.                        items.push(headline.textContent);
  18148.                        uris.push(headline.href);
  18149.                        headline = results.iterateNext();
  18150.                }
  18151.  
  18152.                var newItems = new Object();
  18153.                for (var i = 0 ; i <items.length ; i++) {
  18154.                        newItems[items[i]] = uris[i];
  18155.                }
  18156.                var newItems  = Zotero.Utilities.getItemArray(doc, doc, ''^http://(www.)*economist.com/(.*/)*(displaystory.cfm|cityPage.cfm)'');
  18157.                newItems = Zotero.selectItems(newItems);
  18158.                if (!newItems) {
  18159.                        return true;
  18160.                }
  18161.  
  18162.                for (var i in newItems) {
  18163.                        urls.push(i);
  18164.                }
  18165.        } else if (doc.location.href.toLowerCase().indexOf("displaystory") != -1) {
  18166.                scrape(doc, url);
  18167.                return;
  18168.        }
  18169.        
  18170.        Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  18171.        
  18172.        Zotero.wait();
  18173. }');
  18174.  
  18175.  
  18176. REPLACE INTO translators VALUES ('84bd421d-c6d1-4223-ab80-a156f98a8e30', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'International Herald Tribune', 'Michael Berkowitz', '^http://(www.)?iht.com/',
  18177. 'function detectWeb(doc, url) {
  18178.     if (doc.title == "Search - International Herald Tribune" && doc.location.href != "http://www.iht.com/info/nytarchive.php") {
  18179.         return "multiple";
  18180.     } else {
  18181.         var namespace = doc.documentElement.namespaceURI;
  18182.         var nsResolver = namespace ? function(prefix) {
  18183.             if (prefix == "x") return namespace; else return null;
  18184.         } : null;
  18185.         
  18186.         var xpath = ''//meta[@name="Headline"]'';
  18187.         if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  18188.             return "newspaperArticle";
  18189.         }
  18190.     }
  18191. }',
  18192. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  18193.     if(metaTags[field]) {
  18194.         newItem[zoteroField] = metaTags[field];
  18195.     }
  18196. }
  18197.  
  18198. function scrape(doc, url) {
  18199.     var newItem = new Zotero.Item("newspaperArticle");
  18200.     newItem.publicationTitle = "The International Herald Tribune";
  18201.     newItem.ISSN = "0294-8052";
  18202.     newItem.url = doc.location.href;
  18203.     
  18204.     var metaTags = new Object();
  18205.     
  18206.     var metaTagHTML = doc.getElementsByTagName("meta");
  18207.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  18208.         metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  18209.     }
  18210.  
  18211.     associateMeta(newItem, metaTags, "Headline", "title");
  18212.     associateMeta(newItem, metaTags, "PrintPubDate", "date");
  18213.     associateMeta(newItem, metaTags, "Summary", "abstractNote");
  18214.     associateMeta(newItem, metaTags, "ArticleID", "accessionNumber");
  18215.     associateMeta(newItem, metaTags, "Owner", "extra");
  18216.     
  18217.     if (metaTags["Author"]) {
  18218.         var author = Zotero.Utilities.cleanString(metaTags["Author"]);
  18219.         if (author.substr(0,3).toLowerCase() == "by ") {
  18220.             author = author.substr(3);
  18221.         }
  18222.         
  18223.         var authors = author.split(" and ");
  18224.         for each(var author in authors) {
  18225.             var words = author.split(" ");
  18226.             for (var i in words) {
  18227.                 words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  18228.             }
  18229.             author = words.join(" ");
  18230.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  18231.         }
  18232.     }
  18233.     
  18234.     if (metaTags["keywords"]) {
  18235.         var keywords = metaTags["keywords"];
  18236.         newItem.tags = keywords.split(",");
  18237.         if (newItem.tags[0].toLowerCase()) {
  18238.             newItem.tags = newItem.tags.slice(1, newItem.tags.length);
  18239.         }
  18240.         Zotero.debug(newItem.tags);
  18241.         for (var i in newItem.tags) {
  18242.             if (newItem.tags[i] != "") {
  18243.                 newItem.tags[i] = Zotero.Utilities.cleanString(newItem.tags[i].replace("  ", ", "));
  18244.                 var words = newItem.tags[i].split(" ");
  18245.                 for (var j = 0 ; j < words.length ; j++) {
  18246.                     if (words[j][0] == words[j][0].toLowerCase()) {
  18247.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  18248.                     }
  18249.                 }
  18250.                 newItem.tags[i] = words.join(" ");
  18251.             }
  18252.         }
  18253.     }
  18254.     
  18255.     newItem.complete();
  18256. }
  18257.  
  18258. function doWeb(doc, url) {
  18259.     var namespace = doc.documentElement.namespaceURI;
  18260.     var nsResolver = namespace ? function(prefix) {
  18261.         if (prefix == "x" ) return namespace; else return null;
  18262.     } : null;
  18263.     
  18264.     var uris = new Array();
  18265.     if (doc.title == "Search - International Herald Tribune") {
  18266.         var result = doc.evaluate(''//td[@class="searchheadline"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  18267.         var items = new Array();
  18268.         var elmt = result.iterateNext();
  18269.         while (elmt) {
  18270.             items.push(elmt.href);
  18271.             elmt = result.iterateNext();
  18272.         }
  18273.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^http://(www.)*iht.com/articles/.*\.php$'');
  18274.         items = Zotero.selectItems(items);
  18275.         
  18276.         if (!items) {
  18277.             return true;
  18278.         }
  18279.         
  18280.         for (var i in items) {
  18281.             uris.push(i);
  18282.         }
  18283.         
  18284.     } else if (doc.evaluate(''//meta[@name="Headline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  18285.         uris.push(url);
  18286.     }
  18287.         
  18288.     Zotero.Utilities.processDocuments(uris, scrape, function() { Zotero.done(); });
  18289.     
  18290.     Zotero.wait();
  18291. }
  18292. ');
  18293.  
  18294. REPLACE INTO translators VALUES ('631ff0c7-2e64-4279-a9c9-ad9518d40f2b', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '0', '100', '4', 'Stuff.co.nz', 'Michael Berkowitz', '^http://(www.)?stuff.co.nz/', 
  18295. 'function detectWeb(doc, url) {
  18296.     if ((doc.location.href.indexOf("search-results") != -1) || (doc.location.href.indexOf("/blogs/blogs/") != -1 )) {
  18297.         return "multiple";
  18298.     } else if ((doc.location.href.indexOf("blogs") != -1) && (url != "http://www.stuff.co.nz/blogs/blogs") && (url != "http://stuff.co.nz/blogs/blogs")) {
  18299.         return "blogPost";
  18300.     } else if (doc.location.href.indexOf("html") == (doc.location.href.length - 4)){
  18301.         return "newspaperArticle";
  18302.     }
  18303. }', 
  18304. 'function scrape(doc, url) {
  18305.     if (doc.location.href.indexOf("html") != -1) {
  18306.         var newItem = new Zotero.Item("newspaperArticle");
  18307.         newItem.url = doc.location.href;
  18308.         newItem.publicationTitle = "Stuff.co.nz";
  18309.         newItem.title = doc.title.split(" - ")[0];
  18310.         
  18311.         //abstract
  18312.         var xpath = ''//div[@id="leftcol_story"]/p/strong'';
  18313.         newItem.abstractNote = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  18314.         
  18315.         //date and author
  18316.         var xpath = ''//div[@id="story_headline"]'';
  18317.         var info = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n+/)[2].split(" | ");
  18318.         
  18319.         newItem.date = Zotero.Utilities.cleanString(info[1].split(",")[1]);
  18320.         
  18321.         var author = Zotero.Utilities.cleanString(info[0]);
  18322.         if (author.substr(0,2).toLowerCase() == "by") {
  18323.             author = author.substr(3);
  18324.             if (author.indexOf(" - ") != -1) {
  18325.                 author = author.split(" - ")[0].split(" ");
  18326.             } else {
  18327.                 author = author.split(" ");
  18328.             }
  18329.             for (var i = 0 ; i < author.length ; i++) {
  18330.                 author[i] = author[i][0] + author[i].substr(1).toLowerCase();
  18331.                 var creator = author.join(" ");
  18332.             }
  18333.             newItem.creators.push(Zotero.Utilities.cleanAuthor(creator, "author"));
  18334.         } else {
  18335.             newItem.extra = author;
  18336.         }
  18337.     } else if (doc.location.href.indexOf("blogs") != -1) {
  18338.         var newItem = new Zotero.Item("blogPost");
  18339.         newItem.url = doc.location.href;
  18340.  
  18341.         //post title
  18342.         var xpath = ''//div[@class="post"]/h2[@class="storytitle"]/a'';
  18343.         newItem.title = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  18344.     
  18345.         //date and author
  18346.         var xpath = ''//div[@class="meta"][@id="postdate"]''
  18347.         var info = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(" | ");
  18348.         var byline = Zotero.Utilities.cleanString(info[0]).split(" in ");
  18349.         newItem.creators.push(Zotero.Utilities.cleanAuthor(byline[0], "author"));
  18350.         newItem.blogTitle = byline[1];
  18351.         var date = Zotero.Utilities.cleanString(info[1]).split("m ");
  18352.         newItem.date = date[1];
  18353.     }
  18354.     newItem.complete();
  18355. }
  18356.  
  18357. function doWeb(doc, url) {
  18358.     var URLS = new Array();
  18359.     
  18360.     //multiple
  18361.     if ((url.indexOf("search-results") != -1) || (url.indexOf("blogs/blogs/") != -1)) {
  18362.         if (url.indexOf("search-results") != -1) {
  18363.             var xpath = ''//div[@id="leftcol_story"]/p/a'';
  18364.         } else if (url.indexOf("blogs/blogs/") != -1) {
  18365.             var xpath = ''//h2[@class="storytitle"]/a'';
  18366.         }
  18367.     
  18368.         var items = new Object();
  18369.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  18370.         var newTitle = titles.iterateNext();
  18371.         while (newTitle) {
  18372.             items[newTitle.href] = newTitle.textContent;
  18373.             newTitle = titles.iterateNext();
  18374.         }
  18375.         
  18376.         items = Zotero.selectItems(items);
  18377.         
  18378.         for (var i in items) {
  18379.             URLS.push(i);
  18380.         }
  18381.     } else {
  18382.         URLS.push(url);
  18383.     }
  18384.     
  18385.     Zotero.Utilities.processDocuments(URLS, scrape, function() {Zotero.done();});
  18386.     Zotero.wait();
  18387. }');
  18388.  
  18389. REPLACE INTO translators VALUES ('efb3c424-daa9-40c9-8ee2-983d2802b27a', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '0', '100', '4', 'The Age', 'Michael Berkowitz', '^http://(www|search).theage.com.au/', 
  18390. 'function detectWeb(doc, url) {
  18391.     if (url.indexOf("siteSearch.ac") != -1) {
  18392.         return "multiple";
  18393.     } else if (url.indexOf("html") != -1) {
  18394.         return "newspaperArticle";
  18395.     }
  18396. }', 
  18397. 'function scrape(url) {
  18398.     Zotero.Utilities.HTTP.doGet(url, function(text) {
  18399.         var newItem = new Zotero.Item("newspaperArticle");
  18400.         newItem.ISSN = "0312-6307";
  18401.         newItem.url =url;
  18402.         newItem.publicationTitle = "The Age";
  18403.         Zotero.debug(url);
  18404.         
  18405.         //title
  18406.         var t = /<HEADLINE>(.*)<\/HEADLINE>/;
  18407.         newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1]).split(" - ")[0]);
  18408.         
  18409.         //meta tags? (except abstract, for some reason)
  18410.         var m = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/g;
  18411.         var metaTags = text.match(m);
  18412.         var metaInfo = new Object();
  18413.         var metaNames = new Array();
  18414.         var m2 = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/;
  18415.         for (var i = 0 ; i < metaTags.length ; i++) {
  18416.             var stuff = metaTags[i].match(m2);
  18417.             metaInfo[stuff[1]] = stuff[2];
  18418.             metaNames.push(stuff[1]);
  18419.         }
  18420.         
  18421.         for (var i = 0 ; i <metaNames.length ; i++) {
  18422.             if (metaNames[i] == "sitecategories") {
  18423.                 newItem.section = metaInfo[metaNames[i]].split(",")[0];
  18424.             } else if (metaNames[i] == "publishdate") {
  18425.                 newItem.date = metaInfo[metaNames[i]].split(/\s+/)[0];
  18426.             } else if (metaNames[i] == "byline") {
  18427.                 var byline = metaInfo[metaNames[i]].split(",")[0];
  18428.                 if (byline.indexOf(" and ") != -1) {
  18429.                     byline = byline.split(" and ");
  18430.                     for (var j = 0 ; j < byline.length ; j++) {
  18431.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(byline[j], "author"));
  18432.                     }
  18433.                 } else {
  18434.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(byline, "author"));
  18435.                 }
  18436.             } else if (metaNames[i] == "keywords") {
  18437.                 var keywords = metaInfo[metaNames[i]].split(",");
  18438.                 for (var k = 0 ; k < keywords.length ; k++) {
  18439.                     if (keywords[k].length > 1) {
  18440.                         newItem.tags.push(Zotero.Utilities.unescapeHTML(keywords[k][0].toUpperCase() + keywords[k].substr(1).toLowerCase()));
  18441.                     }
  18442.                 }
  18443.             }
  18444.         }
  18445.         
  18446.         //abstract
  18447.         var a = /\"Description\"\s+content=\"([^\"]*)\"/;
  18448.         newItem.abstractNote = Zotero.Utilities.unescapeHTML(text.match(a)[1].substring(0, text.match(a)[1].length - 3));
  18449.         
  18450.         newItem.complete();
  18451.         Zotero.done();
  18452.     }, function() {});
  18453. }
  18454.  
  18455. function doWeb(doc, url) {
  18456.     var URLS = new Array();
  18457.     if (url.indexOf("siteSearch.ac") != -1) {
  18458.         var xpath = ''//div[@class="searchresults"]/dl/dt/a'';
  18459.         var titles = new Object();
  18460.         var stuff = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  18461.         var newest = stuff.iterateNext();
  18462.         while (newest) {
  18463.             titles[newest.href] = newest.textContent;
  18464.             newest = stuff.iterateNext();
  18465.         }
  18466.         
  18467.         var items = Zotero.selectItems(titles);
  18468.         
  18469.         for (var i in items) {
  18470.             URLS.push(i.split("u=")[1].replace(/%3A/g,":").replace(/%2F/g,"/").split("&")[0]);
  18471.         }
  18472.     } else {
  18473.         URLS.push(url);
  18474.     }
  18475.     
  18476.     Zotero.debug(URLS);
  18477.     
  18478.     Zotero.Utilities.HTTP.doPost(URLS, "", function(text) {
  18479.         for (var i = 0 ; i < URLS.length ; i++) {
  18480.             scrape(URLS[i]);
  18481.         }
  18482.     });
  18483.     Zotero.wait();
  18484. }');
  18485.  
  18486. REPLACE INTO translators VALUES ('c7830593-807e-48cb-99f2-c3bed2b148c2', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '1', '100', '4', 'New Zealand Herald', 'Michael Berkowitz', '^http://(www|search).nzherald.co.nz/', 
  18487. 'function detectWeb(doc, url) {
  18488.     if (doc.title.indexOf("Search Results") != -1) {
  18489.         return "multiple";
  18490.     } else if (doc.location.href.indexOf("story.cfm") != -1) {
  18491.         return "newspaperArticle";
  18492.     }
  18493. }', 
  18494. 'function scrape(url) {
  18495.     Zotero.Utilities.HTTP.doGet(url, function(text) {
  18496.         var newItem = new Zotero.Item("newspaperArticle");
  18497.         newItem.url = url;
  18498.         newItem.publicationTitle = "New Zealand Herald";
  18499.         
  18500.         //author?
  18501.         var aut = /<a href=\"\/author\/[^>]*>(.*)<\/a>/;
  18502.         if (text.match(aut)) {
  18503.             var author = text.match(aut)[1];
  18504.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  18505.         }
  18506.         
  18507.         //abstract
  18508.         var a = /meta name=\"description\" content=\"([^&]*)/;
  18509.         newItem.abstractNote = text.match(a)[1];
  18510.         
  18511.         //title and date
  18512.         var t = /<title>(.*)<\/title>/;
  18513.         var result = text.match(t)[1].split(" - ");
  18514.         newItem.title = result[0];
  18515.         newItem.date = result[1];
  18516.         
  18517.         //keywords
  18518.         var k = /<meta name=\"keywords\" content=\"(.*)\"/;
  18519.         var kwords = Zotero.Utilities.cleanString(text.match(k)[1]).split(", ");
  18520.         for (var i = 0 ; i < kwords.length ; i++) {
  18521.             newItem.tags.push(kwords[i]);
  18522.         }
  18523.         
  18524.         //section
  18525.         var s = /class=\"current\"><.*><span>(.*)<\/span>/;
  18526.         newItem.section = text.match(s)[1];
  18527.         
  18528.         newItem.complete();
  18529.         Zotero.debug(newItem);
  18530.         
  18531.         Zotero.done();
  18532.     }, function() {});
  18533. }
  18534.  
  18535. function doWeb(doc, url) {
  18536.     var articles = new Array();
  18537.     var names = new Array();
  18538.     if (doc.title.indexOf("Search Results:") != -1) {
  18539.         var URLS = new Array();
  18540.         var titles = new Array();
  18541.         var xpath = ''//p[@class="g"]/a'';
  18542.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  18543.         var link = links.iterateNext();
  18544.     
  18545.         while (link) {
  18546.             URLS.push(link.href);
  18547.             titles.push(link.textContent);
  18548.             link = links.iterateNext();
  18549.         }
  18550.         
  18551.         Zotero.debug(titles);
  18552.         Zotero.debug(URLS);
  18553.         
  18554.         var newItems = new Object();
  18555.         
  18556.         for (var i = 0 ; i < titles.length ; i++) {
  18557.             newItems[URLS[i]] = titles[i];
  18558.         }
  18559.     
  18560.         newItems = Zotero.selectItems(newItems);
  18561.     
  18562.         Zotero.debug(newItems);
  18563.         
  18564.         for (var i in newItems) {
  18565.             articles.push(i);
  18566.             names.push(newItems[i]);
  18567.         }
  18568.     } else {
  18569.         articles.push(doc.location.href);
  18570.         names.push(Zotero.Utilities.cleanString(doc.title.split("-")[0]));
  18571.     }
  18572.     
  18573.     Zotero.debug(articles);
  18574.     
  18575.     Zotero.Utilities.HTTP.doPost(articles, "", function(text) {
  18576.         for (var i = 0 ; i < articles.length ; i++) {
  18577.             scrape(articles[i]);
  18578.         }
  18579.     });
  18580.     
  18581.     Zotero.wait();
  18582. }');
  18583.  
  18584. REPLACE INTO translators VALUES ('19120a71-17a8-4629-936a-ccdf899b9861', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '1', '99', '4', 'Sydney Morning Herald', 'Michael Berkowitz', '^http://(www|search).smh.com.au/(news|siteSearch|articles)', 
  18585. 'function detectWeb(doc, url) {
  18586.     if (doc.location.href.indexOf("news") != -1 || doc.location.href.indexOf("articles") != -1) {
  18587.         return "newspaperArticle";
  18588.     } else if (doc.location.href.indexOf("siteSearch") != -1) {
  18589.         return "multiple";
  18590.     }
  18591. }', 
  18592. 'function regexMeta(str, item) {
  18593.     var re = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/;
  18594.     var stuff = str.match(re);
  18595.     if (stuff[1] == "byline") {
  18596.         authors = stuff[2].split(" and ");
  18597.         for (var i = 0 ; i < authors.length ; i++) {
  18598.             item.creators.push(Zotero.Utilities.cleanAuthor(authors[i].split(" in ")[0], "author"));
  18599.         }
  18600.     } else if (stuff[1] == "sitecategories") {
  18601.         item.section = stuff[2];
  18602.     } else if (stuff[1] == "publishdate") {
  18603.         item.date = stuff[2].split(/\s+/)[0];
  18604.     }
  18605. }
  18606.  
  18607. function doWeb(doc, url) {
  18608.     var articles = new Array();
  18609.     if (doc.location.href.indexOf("siteSearch") != -1) {
  18610.         var items = new Array();
  18611.         var xpath = ''//div[@class="searchresults"]/dl/dt/a'';
  18612.         var stuff = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  18613.         var thing = stuff.iterateNext();
  18614.         while (thing) {
  18615.             items[thing.href] = thing.textContent;
  18616.             thing = stuff.iterateNext();
  18617.         }
  18618.         
  18619.         items = Zotero.selectItems(items);
  18620.         
  18621.         for (var i in items) {
  18622.             articles.push(i);
  18623.         }
  18624.     } else {
  18625.         articles.push(url);
  18626.     }
  18627.     for (var i = 0 ; i < articles.length ; i++) {
  18628.         var url = articles[i]
  18629.         Zotero.Utilities.HTTP.doGet(url, function(text) {
  18630.             var newItem = new Zotero.Item("newspaperArticle");
  18631.             newItem.publicationTitle = "Sydney Morning Herald";
  18632.             newItem.url = url;
  18633.             newItem.ISSN = "0312-6315";
  18634.             //title
  18635.             var t = /<HEADLINE>(.*)<\/HEADLINE>/;
  18636.             newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1]));
  18637.             //hooray for real meta tags!
  18638.             var meta = /<meta\s+name=(.*)\/>/g;
  18639.             var metaTags = text.match(meta);
  18640.             for (var i = 0 ; i <metaTags.length ; i++) {
  18641.                 regexMeta(metaTags[i], newItem);
  18642.             }
  18643.             //abstract
  18644.             var abs = /meta name=\"Description\" content=\"([^\"]*)\"/;
  18645.             var abstract = text.match(abs)[1].split(/\s+/);
  18646.             abstract[0] = abstract[0][0] + abstract[0].substr(1).toLowerCase();
  18647.             abstract = abstract.join(" ");
  18648.             newItem.abstractNote = Zotero.Utilities.unescapeHTML(abstract.substr(0, abstract.length - 3));
  18649.             newItem.complete();
  18650.             Zotero.done();
  18651.         }, function() {});
  18652.     }
  18653.     Zotero.wait();
  18654. }');
  18655.  
  18656. REPLACE INTO translators VALUES ('393afc28-212d-47dd-be87-ec51bc7a58a4', '1.0.0b3.r1', '', '2007-08-14 22:20:00', '1', '100', '4', 'The Australian', 'Michael Berkowitz', '^http://(searchresults|www.theaustralian).news.com.au/', 
  18657. 'function detectWeb(doc, url) {
  18658.     if (url == "http://searchresults.news.com.au/servlet/Search" || url.indexOf("siteSearch") != -1) {
  18659.         return "multiple";
  18660.     } else if (url.indexOf("story") != -1) {
  18661.         return "newspaperArticle";
  18662.     }
  18663. }', 
  18664. 'function scrape(url) {
  18665.     Zotero.Utilities.HTTP.doGet(url, function(text) {
  18666.         var newItem = new Zotero.Item("newspaperArticle");
  18667.         newItem.url = url;
  18668.         newItem.publicationTitle = "The Australian";
  18669.         
  18670.         //title
  18671.         var t = /<title>(.*)<\/title>/;
  18672.         newItem.title = Zotero.Utilities.capitalizeTitle(text.match(t)[1].split(" | ")[0]);
  18673.         
  18674.         //abstract
  18675.         var abs = /meta name=\"description\"\s+content=\"(.*)\"/;
  18676.         var abstract = Zotero.Utilities.unescapeHTML(text.match(abs)[1]).split(" ");
  18677.         abstract[0] = abstract[0][0] + abstract[0].substr(1).toLowerCase();
  18678.         newItem.abstractNote = abstract.join(" ");
  18679.         
  18680.         //tags
  18681.         var t = /meta name=\"keywords\"\s+content=\"(.*)\"/;
  18682.         var tags = text.match(t)[1].split(/,\s+/);
  18683.         for (var i = 0 ; i < tags.length ; i++) {
  18684.             newItem.tags.push(Zotero.Utilities.unescapeHTML(tags[i]));
  18685.         }
  18686.  
  18687.         //section
  18688.         var sec = /active\"><a[^>]*>(.*)<\/a>/;
  18689.         if (text.match(sec)) {
  18690.             newItem.section = text.match(sec)[1];
  18691.         }
  18692.         
  18693.         //timestamp
  18694.         var t = /<em class=\"timestamp\">(.*)<\/em>/;
  18695.         newItem.date = text.match(t)[1];
  18696.         
  18697.         //byline
  18698.         var by = /<div\s+class=\"module-subheader\"><p>(.*)/;
  18699.         if (text.match(by)[1]) {
  18700.             var byline = text.match(by)[1];
  18701.             var authors = new Array();
  18702.             if (byline.indexOf(",") != -1) {
  18703.                 byline = byline.split(",")[0];
  18704.             }
  18705.             if (byline.indexOf(" and ") != -1) {
  18706.                 var authors = byline.split(" and ");
  18707.             } else {
  18708.                 authors.push(byline);
  18709.             }
  18710.             for (var i = 0 ; i < authors.length ; i++) {
  18711.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  18712.             }
  18713.         }
  18714.         
  18715.         newItem.complete();
  18716.         Zotero.debug(newItem);
  18717.         
  18718.         Zotero.done();
  18719.     }, function() {});
  18720. }
  18721.  
  18722. function doWeb(doc, url) {
  18723.     var URLS = new Array();
  18724.     var newItems = new Object();
  18725.     if (url == "http://searchresults.news.com.au/servlet/Search") {
  18726.         var articles = new Array();
  18727.         var xpath = ''//ol/li/h4[@class="heading"]/a'';
  18728.         //var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  18729.         
  18730.         newItems = Zotero.Utilities.getItemArray(doc, doc.getElementsByTagName("h4"), /^http:\/\//);
  18731.         newItems = Zotero.selectItems(newItems);
  18732.     } else {
  18733.         newItems[url] = doc.title.split(" | ")[0]; 
  18734.     }
  18735.  
  18736.     for (var i in newItems) {
  18737.         URLS.push(i);
  18738.     }
  18739.     
  18740.     Zotero.debug(URLS);
  18741.     Zotero.Utilities.HTTP.doPost(URLS, "", function(text) {
  18742.         for (var i = 0 ; i < URLS.length ; i++) {
  18743.             scrape(URLS[i]);
  18744.         }
  18745.     });
  18746. }');
  18747.  
  18748. REPLACE INTO translators VALUES ('303bdfc5-11b8-4107-bca1-63ca97701a0f', '1.0.0b3.r1', '', '2007-09-06 19:30:00', '0', '100', '4', 'ASCE', 'Michael Berkowitz', '^http://ascelibrary.aip.org/.+', 
  18749. 'function detectWeb(doc, url) {
  18750.     if (doc.evaluate(''//div[@id="sr-content-wrap"]//div[@class="sr-right"]/p[@class="sr-art-title"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  18751.         return "multiple";
  18752.     } else {
  18753.         return "journalArticle";
  18754.     }
  18755. }', 
  18756. 'function getRIS(doc, url) {
  18757.     var newx = ''//div[@id="sci-art-options-box"]//input[@name="SelectCheck"]'';
  18758.     var key = doc.evaluate(newx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  18759.     Zotero.debug(key);
  18760.     var citation = ''http://ascelibrary.aip.org/getabs/servlet/GetCitation?source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck='' + key + ''&fn=open_refworks&downloadcitation=+Go+'';
  18761.     Zotero.Utilities.HTTP.doGet(citation, function(text) {
  18762.         var translator = Zotero.loadTranslator("import");
  18763.         text = text.replace(/RT/, "TY");
  18764.         text = text.replace(/VO/, "VL");
  18765.         text = text.replace(/LK/, "UR");
  18766.         text = text.replace(/YR/, "PY");
  18767.         Zotero.debug(text);
  18768.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  18769.         translator.setString(text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - "));
  18770.         translator.setHandler("itemDone", function(obj, item) {
  18771.             item.attachments = [
  18772.                 {url:item.url, title:"ASCE Snapshot", mimeType:"text/html"},
  18773.                 {url:"http://ascelibrary.aip.org/getpdf/servlet/GetPDFServlet?filetype=pdf&id=" + key + "&idtype=cvips&prog=search", title:"EAS Full Text PDF", mimeType:"application/pdf"}
  18774.             ];
  18775.             //item.itemType = "journalArticle";
  18776.             item.complete();
  18777.         });
  18778.         translator.translate();
  18779.         Zotero.wait();
  18780.         Zotero.done();
  18781.     });
  18782. }
  18783.  
  18784. function doWeb(doc, url) {
  18785.     var articles = new Array();
  18786.     var items = new Object();
  18787.     var xpath = ''//div[@class="sr-right"]/p[@class="sr-art-title"]/a'';
  18788.     if (doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  18789.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  18790.         while (new_title = titles.iterateNext()) {
  18791.             items[new_title.href] = new_title.textContent;
  18792.         }
  18793.         
  18794.         items = Zotero.selectItems(items);
  18795.         
  18796.         for (var i in items) {
  18797.             articles.push(i)
  18798.         }
  18799.     } else {
  18800.         var newx = ''//div[@id="sci-art-options-box"]//input[@name="SelectCheck"]'';
  18801.         var stuff = doc.evaluate(newx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  18802.         Zotero.debug(stuff);
  18803.         articles.push(url);
  18804.     }
  18805.  
  18806.     Zotero.debug(articles);
  18807.     Zotero.Utilities.processDocuments(articles, getRIS, function() {Zotero.done});
  18808.     Zotero.wait();
  18809.  
  18810. }
  18811. ');
  18812.  
  18813. REPLACE INTO translators VALUES ('5af42734-7cd5-4c69-97fc-bc406999bdba', '1.0.0b4.r5', '', '2008-07-10 06:15:00', '1', '100', '4', 'ESA Journals', 'Michael Berkowitz', 'http://www.esajournals.org/', 
  18814. 'function detectWeb(doc, url) {
  18815.     if (url.indexOf("get-toc") != -1 || url.indexOf("searchtype") != -1) {
  18816.         return "multiple";
  18817.     } else if (url.indexOf("get-document") != -1 || url.indexOf("get-abstract") != -1) {
  18818.         return "journalArticle";
  18819.     }
  18820. }', 
  18821. 'function senCase(string) {
  18822.     var smallwords = Array("AND", "A", "IN", "THE", "BY", "OF");
  18823.     var sen = string.split(/\b/);
  18824.     for (var i = 0 ; i < sen.length; i++) {
  18825.         if (sen[i].match(/\w+/)) {
  18826.             if (smallwords.indexOf(sen[i]) != -1 && i != 0) {
  18827.                 sen[i] = sen[i].toLowerCase();
  18828.             } else {
  18829.                 sen[i] = sen[i][0] + sen[i].substring(1).toLowerCase();
  18830.             }
  18831.         }
  18832.     }
  18833.     return sen.join("");
  18834. }
  18835.  
  18836. function doWeb(doc, url) {
  18837.     var namespace = doc.documentElement.namespaceURI;
  18838.     var nsResolver = namespace ? function(prefix) {
  18839.     if (prefix == ''x'') return namespace; else return null;
  18840.            } : null;
  18841.     
  18842.     var articles = new Array();
  18843.     if (detectWeb(doc, url) == "multiple") {
  18844.         var items = new Object();
  18845.         var resultItems = doc.evaluate(''//div[@class="nocolumn"][@id="content"]/div//*[@class="group"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  18846.         var next_item;
  18847.         while (next_item = resultItems.iterateNext()) {
  18848.             var link = doc.evaluate(''.//a[1]'', next_item, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  18849.             var title = senCase(doc.evaluate(''.//*[@class="title"]'', next_item, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  18850.             items[link] = title;
  18851.         }
  18852.         items = Zotero.selectItems(items);
  18853.         for (var i in items) {
  18854.             articles.push(i);
  18855.         }
  18856.     } else {
  18857.         articles.push(url);
  18858.     }
  18859.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  18860.         var newlink = newDoc.evaluate(''//a[text() = "Create Reference"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  18861.         var itemurl = newDoc.location.href;
  18862.         if (newDoc.evaluate(''//a[text() = "Full Text"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  18863.             itemurl = newDoc.evaluate(''//a[text() = "Full Text"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  18864.         }
  18865.         if (newDoc.evaluate(''//div[@class="doc-head"]/p[contains(text(), "DOI")][@class="info"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  18866.             var doi = newDoc.evaluate(''//div[@class="doc-head"]/p[contains(text(), "DOI")][@class="info"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  18867.             doi = Zotero.Utilities.trimInternal(doi.substr(4));
  18868.         }
  18869.         var issn = newDoc.evaluate(''//div[@id="pageTitle"]/p/a'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.match(/issn=([^&]+)/)[1];
  18870.         newlink = newlink.replace(''cite-builder'', ''download-citation&t=refman&site=esaonline'');
  18871.         Zotero.Utilities.HTTP.doGet(newlink, function(text) {
  18872.             // load translator for RIS
  18873.             var translator = Zotero.loadTranslator("import");
  18874.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  18875.             translator.setString(text);
  18876.             translator.setHandler("itemDone", function(obj, item) {
  18877.                 item.url = decodeURIComponent(itemurl);
  18878.                 if (doi) item.DOI = decodeURIComponent(doi);
  18879.                 var bits = new Array(issn, item.volume, item.issue);
  18880.                 var pdfurl = ''http://www.esajournals.org/archive/'' + bits.join("/") + "/pdf/i" + bits.join("-") + "-" + item.pages.match(/\d+/)[0] + ".pdf";
  18881.                 item.attachments = [
  18882.                     {url:item.url, title:"ESA Journals Snapshot", mimeType:"text/html"},
  18883.                     {url:pdfurl, title:"ESA Full Text PDF", mimeType:"application/pdf"}
  18884.                 ];
  18885.                 item.complete();
  18886.             });
  18887.             translator.translate();
  18888.             
  18889.             Zotero.done();
  18890.         });
  18891.     }, function() {Zotero.done;});
  18892.     Zotero.wait();
  18893. }');
  18894.  
  18895. REPLACE INTO translators VALUES ('1f40baef-eece-43e4-a1cc-27d20c0ce086', '1.0.0b4.r1', '', '2007-07-31 19:40:00', '1', '100', '4', 'Engineering Village', 'Ben Parr', '^https?://(?:www\.)?engineeringvillage(2)?\.(?:com|org)', 
  18896. 'function detectWeb(doc, url)
  18897. {
  18898.     var namespace = doc.documentElement.namespaceURI;
  18899.     var nsResolver = namespace ? function(prefix) {
  18900.             if (prefix == ''x'') return namespace; else return null;
  18901.         } : null;
  18902.         
  18903.     var xpath=''//a[img/@style="vertical-align: middle;"][@href]'';
  18904.     if(doc.evaluate(xpath, doc,
  18905.         nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  18906.         {  return "journalArticle";}
  18907.         
  18908.     xpath=''//input[@name="cbresult"]/@onclick'';
  18909.     if(doc.evaluate(xpath, doc,
  18910.         nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  18911.         {  return "multiple";}
  18912.         
  18913.     return null;
  18914. }', 
  18915. 'function parseRIS(uris)
  18916. {    
  18917.      Zotero.Utilities.HTTP.doGet(uris, function(text){
  18918.              // load translator for RIS
  18919.              var translator = Zotero.loadTranslator("import");
  18920.              translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  18921.              translator.setString(text);
  18922.              translator.translate();
  18923.              Zotero.done();
  18924.      }, function() {});
  18925.      Zotero.wait();
  18926. }
  18927.  
  18928. //creates the link to the RIS file
  18929. function createURL(EISESSION,docidlist,curURL)
  18930. {
  18931.     var milli = (new Date()).getTime();
  18932.     var temp = curURL.split(''/'');        
  18933.     var url = temp.slice(0,temp.length-1).join(''/'') + "/Controller?EISESSION="+EISESSION;
  18934.     url+="&CID=downloadSelectedRecordsris&format=ris&displayformat=fullDoc×tamp="
  18935.     url+=milli;
  18936.     url+="&docidlist=";
  18937.     url+=docidlist;
  18938.     url+="&handlelist=1";
  18939.     return url;
  18940. }
  18941.  
  18942. function doWeb(doc, url) {
  18943.     var namespace = doc.documentElement.namespaceURI;
  18944.     var nsResolver = namespace ? function(prefix) {
  18945.             if (prefix == ''x'') return namespace; else return null;
  18946.         } : null;
  18947.         var url;
  18948.         var xpath=''//a[img/@style="vertical-align: middle;"][@href]'';
  18949.     if(doc.evaluate(xpath, doc,
  18950.         nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  18951.     {
  18952.         xpath=''//a[@class="MedBlueLink"][img]/@onclick'';
  18953.         var temp=doc.evaluate(xpath, doc,
  18954.             nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  18955.         var docidlist=temp.value;
  18956.     
  18957.         docidlist=docidlist.split("MID=")[1];
  18958.         docidlist=docidlist.split("&")[0];
  18959.     
  18960.         xpath=''//a[img/@style="vertical-align: middle;"][@href]'';
  18961.         temp=doc.evaluate(xpath, doc,
  18962.             nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  18963.  
  18964.         var EISESSION =temp.href;
  18965.         EISESSION=EISESSION.split("(''")[1];
  18966.         EISESSION=EISESSION.split("''")[0];
  18967.         url=createURL(EISESSION,docidlist,doc.location.href);
  18968.         parseRIS(url);
  18969.     }
  18970.     else
  18971.     {
  18972.         xpath=''//input[@NAME="sessionid"]'';
  18973.         var EISESSION=doc.evaluate(xpath, doc,
  18974.             nsResolver,XPathResult.ANY_TYPE,null).iterateNext().value;
  18975.         
  18976.         xpath=''//input[@name="cbresult"]/@onclick'';
  18977.         
  18978.         var items=new Array();
  18979.         var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null);
  18980.         var xpath2=''//a[@class="MedBlackText"]/b'';
  18981.         xpath2=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE,null);
  18982.         var title;
  18983.         var docidlist;
  18984.         while(row=rows.iterateNext())
  18985.         {
  18986.             docidlist=row.value;
  18987.             docidlist=docidlist.split("''")[1];
  18988.             
  18989.             url=createURL(EISESSION,docidlist,doc.location.href);
  18990.             
  18991.             title=xpath2.iterateNext();
  18992.             title=title.textContent;
  18993.             
  18994.             items[url]=title;            
  18995.         }
  18996.         items = Zotero.selectItems(items);
  18997.              if(!items) return true;
  18998.              var dois="";
  18999.              var theurls= new Array();
  19000.              for(var thelink in items)
  19001.              {
  19002.                     theurls.push(thelink);
  19003.              }
  19004.     parseRIS(theurls);
  19005.     }
  19006. }');
  19007.  
  19008.  
  19009. REPLACE INTO translators VALUES ('13b9f6fe-ded7-4f91-8c55-5d6ce64fb43e', '1.0.0b4.r1', '', '2007-06-27 02:00:00', '0', '100', '4', 'SPIE Digital Library', 'Asa Kusuma', '^https?://spiedigitallibrary\.aip\.org/', 
  19010. 'function detectWeb(doc, url) {
  19011.     var namespace = doc.documentElement.namespaceURI;
  19012.     var nsResolver = namespace ? function(prefix) {
  19013.         if (prefix == ''x'') return namespace; else return null;
  19014.     } : null;
  19015.     
  19016.     var singXpath = ''//input[@name="SelectCheck"][@type="hidden"]'';
  19017.     var multXpath = ''//input[@name="SelectCheck"][@type="checkbox"]'';
  19018.     
  19019.     
  19020.     //var str=doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  19021.     //Zotero.debug("StRRRr: "+str);
  19022.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  19023.         return "multiple";
  19024.     } if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  19025.         
  19026.         return "journalArticle";
  19027.         
  19028.     }
  19029. }
  19030. ', 
  19031. 'function parseRIS(uris) {
  19032.     
  19033.     Zotero.debug("Begin parsing RIS");
  19034.     Zotero.Utilities.HTTP.doGet(uris, function(text){    
  19035.         // load translator for RIS
  19036.         var translator = Zotero.loadTranslator("import");
  19037.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  19038.         translator.setString(text);
  19039.         translator.translate();
  19040.         Zotero.done();
  19041.     }, function() {});
  19042.     Zotero.wait();
  19043. }
  19044.  
  19045. function doWeb(doc, url) {
  19046.     
  19047.     var namespace = doc.documentElement.namespaceURI;
  19048.     var nsResolver = namespace ? function(prefix) {
  19049.         if (prefix == ''x'') return namespace; else return null;
  19050.     } : null;
  19051.     
  19052.     var singXpath = ''//input[@name="SelectCheck"][@type="hidden"]'';
  19053.     var multXpath = ''//input[@name="SelectCheck"][@type="checkbox"]'';
  19054.     
  19055.  
  19056.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  19057.         //multiple
  19058.         
  19059.         
  19060.         Zotero.debug("Multiple Step 1");
  19061.         var searchtitle = ''//tbody/tr/td/table/tbody/tr[2]/td/font/b'';
  19062.         var bibXpath = ''//input[@name="SelectCheck"][@type="checkbox"]'';
  19063.         var pagetype="";
  19064.         
  19065.         //Checks what type of multiple page it is, search or browse.
  19066.         if(doc.evaluate(searchtitle, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  19067.             var titleXpath=''//a/b'';
  19068.             pagetype="search";
  19069.             Zotero.debug("Found a search page");
  19070.         } else {
  19071.             var titleXpath=''//ul/strong'';
  19072.             Zotero.debug("Found a browse page");
  19073.             pagetype="browse";
  19074.         }
  19075.         var bibElmts = doc.evaluate(bibXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  19076.         var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  19077.         var titleElmt;
  19078.         var bibElmt;
  19079.         bibElmt = bibElmts.iterateNext();
  19080.         titleElmt = titleElmts.iterateNext();
  19081.         
  19082.         var items = new Array();
  19083.         Zotero.debug("Multiple Step 2");
  19084.         do {
  19085.             
  19086.             Zotero.debug("SelectCheck: "+bibElmt.value);
  19087.             items[bibElmt.value] = Zotero.Utilities.cleanString(titleElmt.textContent);
  19088.             if(pagetype=="search") {
  19089.                 titleElmt = titleElmts.iterateNext();
  19090.             }
  19091.         } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  19092.  
  19093.         items = Zotero.selectItems(items);
  19094.         if(!items) return true;
  19095.     
  19096.         var bibcodes="";
  19097.         var uris = new Array();
  19098.         for(var bibcode in items) {
  19099.             Zotero.debug("Export SelectCheck: "+bibcode);
  19100.         
  19101.             var getURL = "http://spiedigitallibrary.aip.org/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=";
  19102.                 getURL=getURL + bibcode +  "&downloadcitation=+Go+";
  19103.                 Zotero.debug(getURL);
  19104.             uris.push(getURL);
  19105.         }
  19106.         
  19107.         parseRIS(uris);
  19108.         
  19109.         
  19110.     } if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  19111.         singXpath = ''//input[@name="SelectCheck"][@type="hidden"]'';
  19112.     
  19113.         var selectid=doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  19114.         Zotero.debug("Node Value: "+selectid);
  19115.         //single
  19116.         var url="http://spiedigitallibrary.aip.org/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=";
  19117.         //PSISDG001207000001000088000001
  19118.         url = url+selectid;
  19119.         url = url + "&downloadcitation=+Go+";
  19120.         var idarray = new Array();
  19121.         idarray.push(url);
  19122.         parseRIS(idarray);
  19123.     }
  19124.     
  19125.     
  19126.     
  19127. }');
  19128.  
  19129. REPLACE INTO translators VALUES ('ab961e61-2a8a-4be1-b8a3-044f20d52d78', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'BIBSYS', 'Ramesh Srigiriraju', '^http://ask\.bibsys\.no/ask/action', 
  19130. 'function detectWeb(doc, url)    {
  19131.     var multireg=new RegExp("^http://ask\.bibsys\.no/ask/action/result");
  19132.     if(multireg.test(url))
  19133.         return "multiple";
  19134.     var singlereg=new RegExp("^http://ask\.bibsys\.no/ask/action/show");
  19135.     if(singlereg.test(url))
  19136.         return "book";
  19137. }', 
  19138. 'function doWeb(doc, url)    {
  19139.     var namespace=doc.documentElement.namespaceURI;
  19140.     var nsResolver=namespace?function(prefix)    {
  19141.         return (prefix=="x")?namespace:null;
  19142.     }:null;
  19143.     var multireg=new RegExp("http://ask\.bibsys\.no/ask/action/result");
  19144.     if(multireg.test(url))    {
  19145.         var titlpath=''//tr/td[@width="49%"][@align="left"][@valign="top"]/a/text()'';
  19146.         var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  19147.         var codepath=''//tr/td/input[@type="checkbox"][@name="valg"]/@value'';
  19148.         var codes=doc.evaluate(codepath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  19149.         var items=new Array();
  19150.         var title;
  19151.         titles.iterateNext();
  19152.         while(title=titles.iterateNext())
  19153.             items[codes.iterateNext().nodeValue]=title.nodeValue;
  19154.         items=Zotero.selectItems(items);
  19155.         var string="http://ask.bibsys.no/ask/action/result?control=ctr_top";
  19156.         for(var codes in items)
  19157.             string+="&valg="+codes;
  19158.         string+="&control=ctr_bottom&eksportFormat=refmanager&eksportEpostAdresse=&eksportEpostFormat=fortekst&cmd=sendtil";
  19159.         Zotero.Utilities.HTTP.doGet(string, function(text)    {
  19160.             var trans=Zotero.loadTranslator("import");
  19161.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  19162.             trans.setString(text);
  19163.             trans.translate();
  19164.             Zotero.done();
  19165.         });
  19166.         Zotero.wait();
  19167.     }
  19168.     var singlereg=new RegExp("http://ask\.bibsys\.no/ask/action/show");
  19169.     if(singlereg.test(url))    {
  19170.         var urlstring="http://ask.bibsys.no/ask/action/show";
  19171.         var data="visningsformat=fortekst_m_eksemplarer&eksportFormat=refmanager&eksportEpostAdresse=&eksportEpostFormat=fortekst&cmd=sendtil";
  19172.         Zotero.Utilities.HTTP.doPost(urlstring, data, function(text)    {
  19173.             var trans=Zotero.loadTranslator("import");
  19174.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  19175.             trans.setString(text);
  19176.             trans.translate();
  19177.             Zotero.done();
  19178.         });
  19179.         Zotero.wait();
  19180.     }
  19181. }');
  19182.  
  19183. REPLACE INTO translators VALUES ('f4130157-93f7-4493-8f24-a7c85549013d', '1.0.0b4.r1', '', '2007-08-27 05:00:00', '0', '100', '4', 'BBC', 'Ben Parr', '^https?://(?:www|news?)\.bbc\.co.uk', 
  19184. 'function detectWeb(doc, url)
  19185. {
  19186.  
  19187.        var namespace = doc.documentElement.namespaceURI;
  19188.       var nsResolver = namespace ? function(prefix) {
  19189.       if (prefix == ''x'') return namespace; else return null;
  19190.       } : null;
  19191.  
  19192.     var xpath;
  19193.       
  19194.      xpath=''//meta[@name="Headline"]'';
  19195.      if(content=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19196.      { return "newspaperArticle";  }
  19197.      
  19198.      xpath=''//font[@class="poshead"]/b'';
  19199.      if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19200.     { return "newspaperArticle";  }
  19201.     
  19202.       return null;
  19203. }', 
  19204. 'function scrape(doc,url,title)
  19205. {
  19206.           var namespace = doc.documentElement.namespaceURI;
  19207.                var nsResolver = namespace ? function(prefix) {
  19208.                 if (prefix == ''x'') return namespace; else return null;
  19209.                 } : null;
  19210.          
  19211.          var newItem = new Zotero.Item("newspaperArticle");
  19212.     
  19213.           newItem.url=url;
  19214.          newItem.repository="bbc.co.uk";
  19215.          newItem.publicationTitle="BBC";
  19216.          newItem.title=title;
  19217.          
  19218.          xpath=''//meta[@name="OriginalPublicationDate"]/@content'';
  19219.          var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  19220.          if(temp)
  19221.          {
  19222.         temp=temp.value;
  19223.              temp=temp.split(" ")[0];
  19224.              newItem.date=temp;
  19225.          }
  19226.          else
  19227.          {
  19228.              xpath=''//font[@class="postxt"][@size="1"]'';
  19229.              var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19230.              var row;
  19231.              while(row=rows.iterateNext())
  19232.              {
  19233.                  temp=row.textContent;
  19234.                  if(temp.substr(0,9)=="Created: ")
  19235.                  {
  19236.                      newItem.date=temp.substr(9);
  19237.                      break;
  19238.                  }
  19239.              }
  19240.          }
  19241.          
  19242.          xpath=''//meta[@name="Section"]/@content'';
  19243.         temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  19244.          if(temp)
  19245.          {     newItem.section=temp.value;     }
  19246.          
  19247.          xpath=''//meta[@name="Description"]/@content'';
  19248.          temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  19249.          if(temp)
  19250.          {     newItem.abstractNote=temp.value;     }
  19251.          else
  19252.          {
  19253.              xpath=''//meta[@name="description"]/@content'';
  19254.                   temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  19255.                  if(temp)
  19256.                  {     newItem.abstractNote=temp.value;     }
  19257.          }
  19258.          
  19259.          newItem.attachments.push({url:url, title:"BBC News Snapshot",mimeType:"text/html"});
  19260.          
  19261.          newItem.complete();
  19262. }
  19263.  
  19264.  
  19265.  
  19266. function doWeb(doc,url)
  19267. {
  19268.        var namespace = doc.documentElement.namespaceURI;
  19269.       var nsResolver = namespace ? function(prefix) {
  19270.       if (prefix == ''x'') return namespace; else return null;
  19271.       } : null;
  19272.       
  19273.       var xpath=''//meta[@name="Headline"]/@content'';
  19274.       var title;
  19275.      if(title=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19276.          {  scrape(doc,url,title.value) }
  19277.      else
  19278.      {
  19279.          xpath=''//font[@class="poshead"]/b'';
  19280.          if(title=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19281.                  {   scrape(doc,url,title.textContent)  }
  19282.      }
  19283.  
  19284.      
  19285. }');
  19286.  
  19287. REPLACE INTO translators VALUES ('dbb5d4bc-3b21-47a2-9751-5dcbb65b902a', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'AMS Online Journals - Allenpress', 'Ben Parr', '^http://ams.allenpress.com/', 
  19288. 'function detectWeb(doc,url)
  19289. {
  19290.       var namespace = doc.documentElement.namespaceURI;
  19291.       var nsResolver = namespace ? function(prefix) {
  19292.       if (prefix == ''x'') return namespace; else return null;
  19293.       } : null;
  19294.  
  19295.           var xpath;
  19296.           
  19297.     //Homepage=AMS Top 20
  19298.     var temp=url.split("request=")[1];
  19299.     if(temp)
  19300.     {
  19301.         if(temp.substr(0,10)=="index-html")
  19302.         { return "multiple"; }
  19303.     }
  19304.     
  19305.     
  19306.     //browse page
  19307.     xpath=''//div[@class="group"]/p[@class="title"]'';
  19308.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19309.         { return "multiple"; }
  19310.         
  19311.     //second browse page format
  19312.     xpath=''//div[@class="toc include j"]/p/span[@class="title"]'';
  19313.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19314.         { return "multiple"; }
  19315.     
  19316.         
  19317.     //search page 
  19318.     xpath=''//td[@class="search"]/span[@class="title"]'';
  19319.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19320.         { return "multiple"; }
  19321.         
  19322.     //single page
  19323.     xpath=''//ul/li/a'';
  19324.     var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19325.     var row;
  19326.     
  19327.     while(row=rows.iterateNext())
  19328.     {
  19329.         if(row.textContent=="Create Reference")
  19330.             { return "journalArticle"; }
  19331.     }
  19332.     
  19333. }', 
  19334. 'function parseRIS(temp,PDFs)
  19335. {
  19336.       Zotero.Utilities.HTTP.doGet(temp, function(text){
  19337.  
  19338.               // load translator for RIS
  19339.               var translator = Zotero.loadTranslator("import");
  19340.           
  19341.               translator.setHandler("itemDone", function(obj, newItem) {
  19342.         //get doi of the item we''re currently saving from RIS file
  19343.         var doi=newItem.DOI;
  19344.         if(!doi)
  19345.             {doi=newItem.url.replace(''http://dx.doi.org/'','''');}
  19346.         else
  19347.             {doi=doi.replace("doi%3A","");}
  19348.         
  19349.         var urlstring='''';
  19350.         var volume=newItem.volume;
  19351.         var issue=newItem.issue;
  19352.         var d=newItem.pages.split("-")[0];
  19353.         
  19354.         var pdf = PDFs.shift();
  19355.         if(pdf)
  19356.         {
  19357.             if(pdf=="0")
  19358.             {
  19359.                 var b=doi.split("/");
  19360.                 if(b.length>1)
  19361.                     {b=b[1];}
  19362.                 else
  19363.                     {b=doi.split("%2F")[1];}
  19364.                 b=b.split("(")[0];
  19365.                 b=b.split("%28")[0];
  19366.                 if(!b||b.length!=9)
  19367.                     {b="1520-0477";}
  19368.                 urlstring="http://ams.allenpress.com/archive/"+b+"/"+volume+"/"+issue+"/pdf/i"+b+"-"+volume+"-"+issue+"-"+d+".pdf";
  19369.             }
  19370.             else if(pdf=="1")
  19371.             {
  19372.                 while(volume.length<3)
  19373.                     {volume="0"+volume;}
  19374.                 while(issue.length<2)
  19375.                     {issue="0"+issue;}
  19376.                 while(d.length<4)
  19377.                     {d="0"+d;}
  19378.                 
  19379.                 urlstring="http://docs.lib.noaa.gov/rescue/mwr/"+volume+"/mwr-"+volume+"-"+issue+"-"+d+".pdf";
  19380.             }
  19381.         }
  19382.         newItem.attachments[0]={
  19383.                 title:"AMS Journals Full Text PDF",
  19384.                 url:urlstring, mimeType:"application/pdf"}
  19385.         
  19386.         if(Zotero.Utilities.cleanString(newItem.abstractNote).toLowerCase()=="no abstract available.")
  19387.             {newItem.abstractNote='''';}
  19388.         newItem.complete();
  19389.         });
  19390.         
  19391.               translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  19392.               translator.setString(text);
  19393.               translator.translate();
  19394.  
  19395.               Zotero.done();
  19396.       }, function() {});
  19397.       Zotero.wait();
  19398. }
  19399.  
  19400.  
  19401. function createLink(link)
  19402. {
  19403.     var url="http://ams.allenpress.com/perlserv/?request=download-citation&t=refman&doi=";
  19404.     url+=getdoi(link);
  19405.     url+="&site=amsonline";
  19406.     return url;
  19407. }
  19408.  
  19409. function getdoi(link)
  19410. {
  19411.     doi=link.split("doi%3A")[1];
  19412.     if(!doi)
  19413.     {
  19414.         doi=link.split("doi=")[1];
  19415.         return doi;
  19416.     }
  19417.     return doi;
  19418. }
  19419.  
  19420. function getType(text)
  19421. {
  19422.     if(text.indexOf("(")>-1)
  19423.         {return "0";}
  19424.     else
  19425.         {return "1";}
  19426. }
  19427.  
  19428. function doWeb(doc,url)
  19429. {
  19430.       var namespace = doc.documentElement.namespaceURI;
  19431.       var nsResolver = namespace ? function(prefix) {
  19432.       if (prefix == ''x'') return namespace; else return null;
  19433.       } : null;
  19434.  
  19435.         var doi;
  19436.         var PDFs=new Array();
  19437.     var xpath=''//ul/li/a'';
  19438.     var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19439.     var row;
  19440.     
  19441.     while(row=rows.iterateNext())
  19442.     {
  19443.         if(row.textContent=="Create Reference")
  19444.         {
  19445.                 //single page
  19446.                 
  19447.                 var thelink=createLink(row.href);
  19448.                 xpath=''//div[@class="mainPadding"]/div/div/div/div/div/p/a'';
  19449.                 rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19450.                 while(row=rows.iterateNext())
  19451.                 {
  19452.                     if(row.textContent.toLowerCase().indexOf("pdf")>-1)
  19453.                         {PDFs.push(getType(row.textContent));}
  19454.                 }
  19455.                 parseRIS(thelink,PDFs);
  19456.                 
  19457.                 return null;
  19458.         }
  19459.     }
  19460.     
  19461.     var items=new Array();
  19462.     
  19463.     xpath=''//div[@class="group"]/p[@class="title"]'';
  19464.     var xpath1='''';
  19465.     var xpath2='''';
  19466.     
  19467.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19468.     {
  19469.         //browse page
  19470.         
  19471.         xpath1=''//div[@class="group"]/p[@class="title"]'';
  19472.         xpath2=''//p[@class="link"]/a'';
  19473.     }
  19474.     else
  19475.     {
  19476.         xpath=''//td[@class="search"]/span[@class="title"]'';
  19477.         if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19478.         {
  19479.             //search page
  19480.             
  19481.             xpath1=''//td[@class="search"]/span[@class="title"]'';
  19482.             xpath2=''//tr/td/a'';
  19483.         }
  19484.         else
  19485.         {
  19486.             xpath=''//div[@class="toc include j"]/p/span[@class="title"]'';
  19487.             if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  19488.             {
  19489.                 //second browse format
  19490.                 
  19491.                 xpath1=''//div[@class="toc include j"]/p/span[@class="title"]'';
  19492.                 xpath2=''//div[@class="toc include j"]/p/a'';
  19493.             }
  19494.         }
  19495.     }
  19496.     
  19497.     if(xpath1!='''')
  19498.     {
  19499.         var rows1=doc.evaluate(xpath1, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19500.         var row1;
  19501.         
  19502.         var rows2=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19503.         var row2=rows2.iterateNext();
  19504.         
  19505.         var rows3=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19506.         var row3;
  19507.         
  19508.         var tPDFs=new Array();
  19509.         var nextType;
  19510.         
  19511.         var link;
  19512.         var lastdoi;
  19513.         
  19514.         while(row1=rows1.iterateNext())
  19515.         {
  19516.             while(row3=rows3.iterateNext())
  19517.             {
  19518.                 if(row3.textContent.toLowerCase().indexOf("pdf")>-1)
  19519.                     {tPDFs.push(getType(row3.textContent));}
  19520.             }
  19521.             while(getdoi(row2.href)==lastdoi || !getdoi(row2.href))
  19522.                 {row2=rows2.iterateNext()}
  19523.             
  19524.             lastdoi=getdoi(row2.href);
  19525.             link=createLink(row2.href);
  19526.             
  19527.             nextType=tPDFs.shift();
  19528.             if(!nextType)
  19529.                 {nextType="none";}
  19530.             items[nextType+link]=row1.textContent;
  19531.         }
  19532.     }
  19533.     else
  19534.     {
  19535.         var t=url.split("request=")[1];
  19536.         if(t)
  19537.         {
  19538.             if(t.substr(0,10)=="index-html")
  19539.             {
  19540.                 //Homepage=AMS Top 20
  19541.                 
  19542.                 xpath=''//div/p/a[@style="font-size: 85%;"]'';
  19543.                 var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19544.                 var row;
  19545.     
  19546.                 while(row=rows.iterateNext())
  19547.                     {items["0"+createLink(row.href)]=row.textContent;}
  19548.             }
  19549.     
  19550.         }
  19551.     }
  19552.         
  19553.         items = Zotero.selectItems(items);
  19554.                 
  19555.         if(!items)
  19556.             {return true;}
  19557.         
  19558.         var urls = new Array();
  19559.         for(var i in items)
  19560.         {
  19561.             PDFs.push(i[0]);
  19562.             urls.push(i.substr(1));
  19563.         }
  19564.         
  19565.         parseRIS(urls,PDFs);
  19566. }');
  19567.  
  19568. REPLACE INTO translators VALUES ('7e51d3fb-082e-4063-8601-cda08f6004a3', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'Education Week', 'Ben Parr', '^https?://(?:www\.|blogs\.|www2\.)?edweek', 
  19569. 'function detectWeb(doc,url)
  19570. {
  19571.        var namespace = doc.documentElement.namespaceURI;
  19572.        var nsResolver = namespace ? function(prefix) {
  19573.        if (prefix == ''x'') return namespace; else return null;
  19574.        } : null;
  19575.        
  19576.        var xpath=''//meta[@name="Story_type"]/@content'';
  19577.        var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19578.        if(temp)
  19579.        {
  19580.                if(temp.value=="Blog")
  19581.                        {return "blogPost";}
  19582.                if(temp.value.indexOf("Story")>-1)
  19583.                        {return "magazineArticle";}
  19584.        }
  19585. }', 
  19586. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  19587.       if(metaTags[field]) {
  19588.               newItem[zoteroField] = metaTags[field];
  19589.       }
  19590. }
  19591.  
  19592. function scrape(doc, url) {
  19593.  
  19594.       var newItem = new Zotero.Item("magazineArticle");
  19595.        if(url&&url.indexOf("blogs.edweek.org")>-1)
  19596.                {newItem.itemType="blogPost";}
  19597.  
  19598.       newItem.url = doc.location.href;
  19599.  
  19600.       var metaTags = new Object();
  19601.  
  19602.       var metaTagHTML = doc.getElementsByTagName("meta");
  19603.       var i;
  19604.       for (i = 0 ; i < metaTagHTML.length ; i++) {
  19605.               metaTags[metaTagHTML[i].getAttribute("name")]=Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  19606.       }
  19607.       associateMeta(newItem, metaTags, "Title", "title");
  19608.       associateMeta(newItem, metaTags, "Cover_date", "date");
  19609.       associateMeta(newItem, metaTags, "Description", "abstractNote");
  19610.       associateMeta(newItem, metaTags, "ArticleID", "accessionNumber");
  19611.       associateMeta(newItem,metaTags,"Source","publicationTitle");
  19612.  
  19613.  
  19614.         if (metaTags["Authors"]) {
  19615.               var author = Zotero.Utilities.cleanString(metaTags["Authors"]);
  19616.               if (author.substr(0,3).toLowerCase() == "by ") {
  19617.                       author = author.substr(3);
  19618.               }
  19619.  
  19620.               var authors = author.split(" and ");
  19621.               for each(var author in authors) {
  19622.                       var words = author.split(" ");
  19623.                       for (var i in words) {
  19624.                               words[i] = words[i][0].toUpperCase() +words[i].substr(1).toLowerCase();
  19625.                       }
  19626.                       author = words.join(" ");
  19627.  
  19628.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  19629.               }
  19630.       }
  19631.  
  19632.        newItem.complete();
  19633. }
  19634.  
  19635. function doWeb(doc,url)
  19636. {
  19637.        var namespace = doc.documentElement.namespaceURI;
  19638.        var nsResolver = namespace ? function(prefix) {
  19639.        if (prefix == ''x'') return namespace; else return null;
  19640.        } : null;
  19641.  
  19642.       var xpath=''//meta[@name="Story_type"]/@content'';
  19643.       var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19644.       if(temp)
  19645.       {
  19646.              if(temp.value.indexOf("Story")>-1 || temp.value=="Blog")
  19647.                        {scrape(doc,url);}
  19648.       }
  19649. }');
  19650.  
  19651. REPLACE INTO translators VALUES ('9220fa99-b936-430e-a8ea-43ca6cb04145', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'AGU Journals', 'Ben Parr','^https?://(?:www.)?agu.org',
  19652. 'function detectWeb(doc,url)
  19653. {
  19654.      var namespace = doc.documentElement.namespaceURI;
  19655.      var nsResolver = namespace ? function(prefix) {
  19656.      if (prefix == ''x'') return namespace; else return null;
  19657.      } : null;
  19658.  
  19659.        var xpath;
  19660.  
  19661.        //abstract
  19662.        xpath=''//p[@id="citation"]'';
  19663.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  19664.                { return "journalArticle"; }
  19665.  
  19666.        //full text
  19667.        xpath=''//frameset[@rows="98, *"]'';
  19668.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  19669.                { return "journalArticle"; }
  19670.  
  19671.        //issue page
  19672.        xpath=''//tr/td/p[@class="title"]'';
  19673.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  19674.                { return "multiple"; }
  19675.  
  19676.        //Search  Page
  19677.        if(doc.title.indexOf("Query Results")>-1)
  19678.                {return "multiple";}
  19679. }
  19680. ',
  19681. 'function fixCaps(s)
  19682. {
  19683.        if(s!='''')
  19684.        {
  19685.                words=Zotero.Utilities.cleanString(s).toLowerCase().split(" ");
  19686.                for (var j = 0 ; j < words.length ; j++)
  19687.                {
  19688.                        if (j==0||(words[j][0] ==words[j][0].toLowerCase()&&words[j]!="or"&&words[j]!="and"&&words[j]!="of"&&words[j]!="in"))
  19689.                                {   words[j]= words[j][0].toUpperCase() +words[j].substr(1);   }
  19690.                }
  19691.                return words.join(" ");
  19692.        }
  19693.        return '''';
  19694. }
  19695.  
  19696. function scrape(doc,url)
  19697. {
  19698.        var namespace = doc.documentElement.namespaceURI;
  19699.        var nsResolver = namespace ? function(prefix) {
  19700.        if (prefix == ''x'') return namespace; else return null;
  19701.        } : null;
  19702.  
  19703.        var newItem=new Zotero.Item("journalArticle");
  19704.        var temp;
  19705.        var xpath;
  19706.        var row;
  19707.        var rows;
  19708.  
  19709.        newItem.url = doc.location.href;
  19710.  
  19711.        xpath=''//p[@id="title"]'';
  19712.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19713.        if(temp)
  19714.                {newItem.title=temp.textContent;}
  19715.  
  19716.        xpath=''//span[@id="published"]'';
  19717.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19718.        if(temp)
  19719.        {
  19720.                temp=Zotero.Utilities.cleanString(temp.textContent).split(" ");;
  19721.                newItem.date=temp[1]+" "+temp[0]+", "+temp[2];
  19722.        }
  19723.  
  19724.        xpath=''//p[@class="author"]'';
  19725.        rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19726.        var count=0;
  19727.        while(row=rows.iterateNext())
  19728.                {newItem.creators.push(Zotero.Utilities.cleanAuthor(row.textContent,"author"));
  19729.                count++;}
  19730.  
  19731.        xpath=''//tr/td/p'';
  19732.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19733.        var temp2=temp.iterateNext();
  19734.        if(temp2)
  19735.        {
  19736.                for(var n=0;n<(3+2*count);n++)
  19737.                        {temp2=temp.iterateNext();}
  19738.                newItem.abstractNote=Zotero.Utilities.cleanString(temp2.textContent);
  19739.        }
  19740.  
  19741.        xpath=''//p[@id="runhead"]'';
  19742.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19743.        if(temp)
  19744.        {
  19745.                temp=Zotero.Utilities.cleanString(temp.textContent).split(", ");
  19746.                newItem.publicationTitle=fixCaps(temp[0]);
  19747.                for(var n=1;temp[n];n++)
  19748.                {
  19749.                        if(temp[n].indexOf("VOL")>-1)
  19750.                                {newItem.volume=temp[n].replace(''VOL. '','''');}
  19751.                        else if(temp[n].indexOf("NO.")>-1)
  19752.                                {newItem.issue=temp[n].replace(''NO. '','''');}
  19753.                        else if(temp[n].indexOf("doi:")>-1)
  19754.                                {newItem.DOI=temp[n].replace(''doi:'','''');}
  19755.                        else if(temp[n+1])
  19756.                                {newItem.pages=temp[n];}
  19757.                }
  19758.        }
  19759.  
  19760.        xpath=''//p[@id="keywords"]'';
  19761.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19762.        if(temp)
  19763.        {
  19764.                temp=Zotero.Utilities.cleanString(temp.textContent.replace(''Keywords:'',''''));
  19765.                newItem.tags=temp.replace(''.'','''').split(''; '');
  19766.        }
  19767.        xpath=''//p[@id="citation"]/span[@id="journal"]'';
  19768.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  19769.        if(temp)
  19770.                {newItem.journalAbbreviation=temp.textContent;}
  19771.  
  19772.        newItem.complete();
  19773. }
  19774.  
  19775.  
  19776. function processList(items)
  19777. {
  19778.                items = Zotero.selectItems(items);
  19779.                var uris=new Array();
  19780.  
  19781.               if (!items)
  19782.                        {return true;}
  19783.  
  19784.               for (var i in items)
  19785.                        {uris.push(i);}
  19786.  
  19787.              Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); });
  19788.              Zotero.wait();
  19789.  
  19790.              return true;
  19791. }
  19792.  
  19793. function doWeb(doc,url)
  19794. {
  19795.      var namespace = doc.documentElement.namespaceURI;
  19796.      var nsResolver = namespace ? function(prefix) {
  19797.      if (prefix == ''x'') return namespace; else return null;
  19798.      } : null;
  19799.  
  19800.        //abstract
  19801.        var xpath=''//p[@id="citation"]'';
  19802.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  19803.        {
  19804.                scrape(doc,url);
  19805.                return true;
  19806.        }
  19807.  
  19808.        //full text
  19809.        xpath=''//frameset[@rows="98, *"]'';
  19810.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  19811.        {
  19812.                Zotero.Utilities.processDocuments(url+"0.shtml", scrape, function(){ Zotero.done(); });
  19813.                Zotero.wait();
  19814.  
  19815.                return true;
  19816.        }
  19817.  
  19818.        //issue page
  19819.        xpath=''//tr/td/p[@class="title"]'';
  19820.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  19821.        {
  19822.                var titlerows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19823.                xpath=''//tr/td/p[@class="pubdate"]/a'';
  19824.                var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19825.  
  19826.                var titlerow;
  19827.                var linkrow;
  19828.                var items=new Array();
  19829.  
  19830.                while(titlerow=titlerows.iterateNext())
  19831.                {
  19832.                        linkrow=linkrows.iterateNext();
  19833.                        while(linkrow.textContent.indexOf("Abstract")<0)
  19834.                                {linkrow=linkrows.iterateNext();}
  19835.                        items[linkrow.href]=titlerow.textContent;
  19836.                }
  19837.  
  19838.                return processList(items);
  19839.        }
  19840.  
  19841.  
  19842.        //Search page
  19843.        if(doc.title.indexOf("Query Results")>-1)
  19844.        {
  19845.                //FASTFind Search
  19846.  
  19847.                xpath=''//tr/td/h2'';
  19848.                var tt=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext().textContent;
  19849.                if(tt.indexOf("FASTFIND")>-1)
  19850.                {
  19851.                        xpath=''//tr/td[1]/font'';
  19852.                        var citerows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19853.                        xpath=''//tr/td[2]/font/a'';
  19854.                        var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19855.  
  19856.                        var citerow;
  19857.                        var linkrow;
  19858.                        var items=new Array();
  19859.                        var temp;
  19860.                        var title;
  19861.  
  19862.                        while(citerow=citerows.iterateNext())
  19863.                        {
  19864.                                linkrow=linkrows.iterateNext();
  19865.                                items[linkrow.href]=Zotero.Utilities.cleanString(citerow.textContent);
  19866.                        }
  19867.                        return processList(items);
  19868.                }
  19869.                else
  19870.                {
  19871.                        //Advanced Search
  19872.  
  19873.                        xpath=''//tr/td[1]/font/a'';
  19874.                        var titlerows=doc.evaluate(xpath, doc,nsResolver,XPathResult.ANY_TYPE, null);
  19875.                        xpath=''//tr/td[2]/font/a'';
  19876.                        var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19877.  
  19878.                        var titlerow;
  19879.                        var linkrow;
  19880.                        var items=new Array();
  19881.                        var temp;
  19882.  
  19883.                        while(titlerow=titlerows.iterateNext())
  19884.                        {
  19885.                                linkrow=linkrows.iterateNext();
  19886.                                while(linkrow.textContent.indexOf("Abstract")<0)
  19887.                                        {linkrow=linkrows.iterateNext();}
  19888.  
  19889.                                items[linkrow.href]=titlerow.textContent;
  19890.                        }
  19891.                        return processList(items);
  19892.                }
  19893.        }
  19894.  
  19895. }
  19896. ');
  19897.  
  19898. REPLACE INTO translators VALUES ('e4fe1596-a8c4-4d09-945f-120c4d83e580', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'LA Times', 'Ben Parr', '^https?://(?:www.|travel.)?latimes.com', 
  19899. 'function detectWeb(doc, url)
  19900. {
  19901.    var namespace = doc.documentElement.namespaceURI;
  19902.                var nsResolver = namespace ? function(prefix) {
  19903.                if (prefix == ''x'') return namespace; else return null;
  19904.                } : null;
  19905.  
  19906.               var xpath = ''//link[@title="Main"]'';
  19907.               if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext())
  19908.                       {return "newspaperArticle";}
  19909.  
  19910.               if(doc.title.indexOf("Search Results")>-1)
  19911.                       {return "multiple";}
  19912.  
  19913.               xpath = ''//h1'';
  19914.               var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19915.               var row;
  19916.               while(row=rows.iterateNext())
  19917.               {
  19918.         if(Zotero.Utilities.cleanString(row.textContent.toLowerCase())=="travel")
  19919.                               {return "newspaperArticle";}
  19920.               }
  19921.  
  19922.               return null;
  19923. }', 
  19924. 'function getCount(s)
  19925. {
  19926.       if(!s||s=='''')
  19927.               return 0;
  19928.       if(s.indexOf("Displaying")>-1)
  19929.       {
  19930.               s=s.substr(19);
  19931.               s=s.replace(''.'','''');
  19932.               s=s.split('' to '');
  19933.               return s[1]-s[0]+1;
  19934.       }
  19935.       return 0;
  19936. }
  19937.  
  19938. function processList(items)
  19939. {
  19940.               items = Zotero.selectItems(items);
  19941.               var uris=new Array();
  19942.  
  19943.              if (!items)
  19944.                       {return true;}
  19945.  
  19946.              for (var i in items)
  19947.                       {uris.push(i);}
  19948.  
  19949.             Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); });
  19950.             Zotero.wait();
  19951.  
  19952.             return true;
  19953. }
  19954.  
  19955. function findDate(s)
  19956. {
  19957.       var words=s.split(" ");
  19958.       var months=new Array("january","febuary","march","april","may","june","july","august","september","october","november","december");
  19959.       for(var n=0;words[n];n++)
  19960.       {
  19961.               for(var m in months)
  19962.                       {if(words[n].toLowerCase()==months[m])
  19963.                               {return words[n]+" "+words[n+1]+" "+words[n+2];}
  19964.                       }
  19965.       }
  19966.       return null;
  19967. }
  19968.  
  19969.  
  19970. function scrape(doc,url)
  19971. {
  19972.       var namespace = doc.documentElement.namespaceURI;
  19973.       var nsResolver = namespace ? function(prefix) {
  19974.               if (prefix == ''x'') return namespace; else return null;
  19975.       } : null;
  19976.  
  19977.       var newItem = new Zotero.Item("newspaperArticle");
  19978.       newItem.publicationTitle = "The Los Angeles Times";
  19979.       newItem.ISSN = "0458-3035";
  19980.  
  19981.       var xpath=''//h2/a'';
  19982.       var t=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  19983.       if(t)
  19984.               {newItem.section=t.textContent; }
  19985.       else
  19986.       {
  19987.               xpath=''//a/img[@alt="WEST"]'';
  19988.               if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext())
  19989.                       {newItem.section="West";}
  19990.               else
  19991.               {
  19992.                       xpath = ''//h1'';
  19993.                       var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  19994.                       if(t=rows.iterateNext())
  19995.                               {newItem.section=t.textContent;}
  19996.               }
  19997.       }
  19998.  
  19999.  
  20000.       xpath=''//h1[last()]'';
  20001.       var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  20002.       if(t=rows.iterateNext())
  20003.               {newItem.title=t.textContent;}
  20004.  
  20005.       newItem.url = url;
  20006.       xpath=''//div[@class="storybyline"]'';
  20007.       var test=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  20008.       if(!test)
  20009.               {xpath=''//p[@class="by-author"]'';}
  20010.       var info=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext().textContent;
  20011.       info=Zotero.Utilities.cleanString(info);
  20012.       var date=findDate(info);
  20013.       if(date)
  20014.       {
  20015.               newItem.date=date;
  20016.               info=info.replace(date,'''');
  20017.       }
  20018.       info=Zotero.Utilities.cleanString(info);
  20019.       if(info.indexOf(", ")>-1)
  20020.       {
  20021.               var phrases=info.split(", ");
  20022.               var a=phrases[0];
  20023.               if (a.substr(0,3).toLowerCase() == "by ")
  20024.                      {a= a.substr(3);}
  20025.               if(a.substr(0,5).toLowerCase()!="from ")
  20026.               {
  20027.                       var authors=a.split(" and ");
  20028.                       var n;
  20029.                       for(n in authors)
  20030.             {newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[n],"author"));}
  20031.               }
  20032.       }
  20033.       else
  20034.       {
  20035.               xpath=''//div[@class="storydeckhead"]/a'';
  20036.               temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  20037.               if(temp!=null && temp!='''')
  20038.         {newItem.creators.push(Zotero.Utilities.cleanAuthor(temp.textContent,"author"));}
  20039.       }
  20040.  
  20041.       newItem.attachments.push({document:doc, title:"The Los Angeles Times Snapshot"});
  20042.       newItem.complete();
  20043. }
  20044.  
  20045.  
  20046.  
  20047. function doWeb(doc, url)
  20048. {
  20049.       var namespace = doc.documentElement.namespaceURI;
  20050.       var nsResolver = namespace ? function(prefix) {
  20051.               if (prefix == ''x'') return namespace; else return null;
  20052.       } : null;
  20053.  
  20054.  
  20055.       var xpath=''//link[@title="Main"]'';
  20056.       if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext())
  20057.               {scrape(doc,url); return true;}
  20058.  
  20059.       xpath = ''//h1'';
  20060.       var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  20061.       var row;
  20062.       while(row=rows.iterateNext())
  20063.       {
  20064.               if(Zotero.Utilities.cleanString(row.textContent.toLowerCase())=="travel")
  20065.                       {scrape(doc,url); return true;}
  20066.       }
  20067.  
  20068.       if(doc.title.indexOf("Search Results")>-1)
  20069.       {
  20070.               xpath=''//div[@class="abstract1"]'';
  20071.               var count=0;
  20072.               rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  20073.               while(row=rows.iterateNext())
  20074.               {
  20075.                       count=getCount(row.textContent);
  20076.                       if(count!=0)
  20077.                               {break;}
  20078.               }
  20079.               if(count==0)
  20080.               {
  20081.                       xpath=''//td[@class="abstract1"]'';
  20082.                       rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  20083.                       while(row=rows.iterateNext())
  20084.                       {
  20085.                               count=getCount(row.textContent);
  20086.                               if(count!=0)
  20087.                                       {break;}
  20088.                       }
  20089.               }
  20090.  
  20091.               if(count>0)
  20092.               {
  20093.                       var items=new Array();
  20094.                       xpath=''//div[@class="headline14"]/a'';
  20095.                       rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  20096.                       while(row=rows.iterateNext())
  20097.                       {
  20098.                               if(count==0)
  20099.                                       {break;}
  20100.                               if(row.href.indexOf("/travel/")<0)
  20101.                 {items[row.href]=Zotero.Utilities.cleanString(row.textContent);}
  20102.                               count--;
  20103.                       }
  20104.  
  20105.                       return processList(items);
  20106.               }
  20107.       }
  20108. }');
  20109.  
  20110. REPLACE INTO translators VALUES ('1a3e63b2-0adf-4c8e-928b-c58c2594b45d', '1.0.0b4.r1', '', '2008-07-15 19:45:00', '1', '100', '4', 'BioMed Central and More', 'Ben Parr', 'http://[^/]*(jcmr-online|respiratory-research|bio-diglib|nuclear-receptor|medimmunol|kinetoplastids|filariajournal|cellandchromosome|actavetscand|aidsrestherapy|almob|ann-clinmicrob|annals-general-psychiatry|asir-journal|arthritis-research|apfmj|anzhealthpolicy|behavioralandbrainfunctions|biodatamining|biology-direct|biomagres|biomedical-engineering-online|bpsmedicine|biotechnologyforbiofuels|biomedcentral|breast-cancer-research|cancerci|cbmjournal|cardiab|cardiovascularultrasound|casesjournal|lipidsignaling.cbdjournals|biosignaling|celldiv|cerebrospinalfluidresearch|journal.chemistrycentral|capmh|cmjournal|chiroandosteo|clinicalmolecularallergy|cpementalhealth|comparative-hepatology|conflictandhealth|resource-allocation|coughjournal|ccforum|cytojournal|diagnosticpathology|dynamic-med|ete-online|ehjournal|epi-perspectives|epigeneticsandchromatin|fibrogenesis|frontiersinzoology|gvt-journal|genomebiology|genomemedicine|geochemicaltransactions|globalizationandhealth|gutpathogens|harmreductionjournal|head-face-med|hqlo|health-policy-systems|human-resources-health|immunityageing|immunome-research|implementationscience|infectagentscancer|intarchmed|internationalbreastfeedingjournal|equityhealthj|ijbnpa|ij-healthgeographics|ijmhs|issoonline|jautoimdis|jbioleng|jbiol|j-biomed-discovery|jbppni|carcinogenesis|cardiothoracicsurgery|jcmr-online|jcircadianrhythms|ethnobiomed|jexpclinassistreprod|jeccr|jfootankleres|jhoonline|jibtherapies|journal-inflammation|jmedicalcasereports|jmolecularsignaling|jnanobiotechnology|jnrbm|jneuroengrehab|jneuroinflammation|occup-med|josr-online|jissn|translational-medicine|traumamanagement|lipidworld|malariajournal|microbialcellfactories|molecularbrain|molecular-cancer|molecularcytogenetics|molecularneurodegeneration|molecularpain|neuraldevelopment|nonlinearbiomedphys|nutritionandmetabolism|nutritionj|ojrd|om-pc|parasitesandvectors|particleandfibretoxicology|pathogeneticsjournal|pssjournal|ped-rheum|peh-med|plantmethods|pophealthmetrics|proteomesci|ro-journal|rbej|reproductive-health-journal|respiratory-research|retrovirology|salinesystems|the-scientist|scoliosisjournal|scfbm|substanceabusepolicy|tbiomed|thrombosisjournal|thyroidresearchjournal|tobaccoinduceddiseases|trialsjournal|urooncologyjournal|virologyj|wjes|wjso)\.(com|org|net)', 
  20111. 'function detectWeb(doc,url)
  20112. {
  20113.     var namespace = doc.documentElement.namespaceURI;
  20114.         var nsResolver = namespace ? function(prefix) {
  20115.         if (prefix == "x" ) return namespace; else return null;
  20116.         } : null;
  20117.         
  20118.         var xpath=''//meta[@name="citation_fulltext_html_url"]'';
  20119.         
  20120.         //Single
  20121.         if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) 
  20122.             {return "journalArticle";}
  20123.             
  20124.         
  20125.         //Multiple
  20126.         xpath=''//a[@class="hiddenlink"][span[@class="xcitationtitle"][b]]'';
  20127.     xpath+='' | //span[@class="xcitationtitle2"]/a[@class="hiddenlink"]'';
  20128.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  20129.     xpath+='' | //p[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  20130.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  20131.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  20132.     
  20133.     var rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20134.     var row;
  20135.     var link;
  20136.     while(row=rows.iterateNext())
  20137.     {
  20138.         link=row.href;
  20139.         if(link.indexOf("pubmed")<0 && link.substr(link.length-4)!=".pdf" && link.indexOf("blogs.")<0)
  20140.             {return "multiple";}
  20141.     }
  20142.     
  20143. }', 
  20144. 'function parseRIS(getURL)
  20145. {  
  20146.     Zotero.Utilities.HTTP.doGet(getURL, function(text){
  20147.         // load translator for RIS
  20148.         var translator = Zotero.loadTranslator ("import");
  20149.         translator.setHandler("itemDone", function(obj, newItem) {
  20150.             var doi = newItem.DOI;
  20151.         var splitURL = newItem.url.split(''/'');
  20152.         
  20153.         if(splitURL.length>=3 && doi){
  20154.             var doiSuffix = doi.slice(doi.indexOf(''/'')+1);
  20155.             var pdfURL = splitURL[0] + ''/'' + splitURL[1] + ''/'' + splitURL[2];
  20156.             pdfURL += ''/content/pdf/'' + doiSuffix + ''.pdf'';
  20157.             var source = splitURL[2].replace(/^www./i,'''').replace(/\.[\w]+$/i,'''');
  20158.             newItem.attachments = [
  20159.                 //{url:newItem.url+''/abstract'', title:source + " Abstract Snapshot", mimeType:"text/html"},
  20160.                 {url:newItem.url, title:source + " Snapshot", mimeType:"text/html"},
  20161.                 {url:pdfURL, title:source + " PDF", mimeType:"application/pdf"}
  20162.             ];
  20163.         }
  20164.             newItem.complete();
  20165.         });
  20166.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20167.         translator.setString(text);
  20168.         translator.translate();
  20169.         Zotero.done();
  20170.     }, function() {});
  20171.  
  20172.     Zotero.wait();
  20173. }
  20174.  
  20175. function doWeb(doc,url)
  20176. {
  20177.     var namespace = doc.documentElement.namespaceURI;
  20178.         var nsResolver = namespace ? function(prefix) {
  20179.         if (prefix == "x" ) return namespace; else return null;
  20180.         } : null;
  20181.         
  20182.         var xpath=''//meta[@name="citation_fulltext_html_url"]/@content'';
  20183.         var rows;
  20184.         var row=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  20185.         if (row) 
  20186.         {
  20187.             //Single Article            
  20188.             var url=row.textContent+"/citation/";
  20189.             Zotero.Utilities.HTTP.doPost(url, ''include=cit&format=refman&direct=on&submit=Download+references&action=submit'', function(text)
  20190.                 {parseRIS(url+''?include=cit&format=refman&direct=on&submit=Download+references&action=submit'');});
  20191.    
  20192.             Zotero.wait();
  20193.             return true;
  20194.     }
  20195.      
  20196.      
  20197.      //Multiple
  20198.         xpath=''//a[@class="hiddenlink"][span[@class="xcitationtitle"][b]]'';
  20199.     xpath+='' | //span[@class="xcitationtitle2"]/a[@class="hiddenlink"]'';
  20200.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  20201.     xpath+='' | //p[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  20202.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  20203.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  20204.  
  20205.     rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20206.     var items=new Array();
  20207.     var link;
  20208.     var t;
  20209.     while(row=rows.iterateNext())
  20210.     {
  20211.         link=row.href;
  20212.         if(link.indexOf("pubmed")<0 && link.substr(link.length-4)!=".pdf" && link.indexOf("blogs.")<0)
  20213.         {
  20214.             t=link.split(''/'');
  20215.             if(t[t.length-1].indexOf("comments#")>-1)
  20216.                 {link=t.slice(0,t.length-1).join(''/'');}
  20217.             items[link.replace("/abstract","")+"/citation"]=row.textContent;
  20218.         }
  20219.     }
  20220.     
  20221.     items = Zotero.selectItems(items);
  20222.            var uris=new Array();
  20223.            if (!items)
  20224.                {return true;}
  20225.  
  20226.         for (var i in items)
  20227.                {uris.push(i);}
  20228.  
  20229.            Zotero.Utilities.HTTP.doPost(uris, "include=cit&format=refman&direct=on&submit=Download+references&action=submit", function(text)
  20230.            {
  20231.                for (var j = 0 ; j < uris.length ; j++)
  20232.                    {parseRIS(uris[j] + "?include=cit&format=refman&direct=on&submit=Download+references&action=submit");}
  20233.            });
  20234.        
  20235.            Zotero.wait();
  20236. }
  20237. ');
  20238.  
  20239. REPLACE INTO translators VALUES ('8a07dd43-2bce-47bf-b4bf-c0fc441b79a9', '1.0.0b4.r5', '', '2008-07-15 19:40:00', '0', '100', '4', 'Optics Express', 'Michael Berkowitz', 'http://(www.)?opticsexpress\.org', 
  20240. 'function detectWeb(doc, url) {
  20241.     var namespace = doc.documentElement.namespaceURI;
  20242.     var nsResolver = namespace ? function(prefix) {
  20243.         if (prefix == ''x'') return namespace; else return null;
  20244.     } : null;
  20245.     
  20246.     var searchpath = ''//div[@id="col2"]/p/strong/a'';
  20247.     if (doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20248.         return "multiple";
  20249.     } else if (url.indexOf("abstract.cfm") != -1) {
  20250.         return "journalArticle";
  20251.     }
  20252. }', 
  20253. 'function doWeb(doc, url) {
  20254.     var namespace = doc.documentElement.namespaceURI;
  20255.     var nsResolver = namespace ? function(prefix) {
  20256.         if (prefix == ''x'') return namespace; else return null;
  20257.     } : null;
  20258.     
  20259.     var  articles = new Array();
  20260.     
  20261.     if (detectWeb(doc, url) == "multiple") {
  20262.         var items = new Object();
  20263.         var xpath = ''//div[@id="col2"]/p/strong/a'';
  20264.         var art = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20265.         var next_art;
  20266.         while (next_art = art.iterateNext()) {
  20267.             items[next_art.href] = Zotero.Utilities.trimInternal(next_art.textContent);
  20268.         }
  20269.         items = Zotero.selectItems(items);
  20270.         for (var i in items) {
  20271.             articles.push(i);
  20272.         }
  20273.     } else {
  20274.         articles = [url];
  20275.     }
  20276.     for (var a in articles) {
  20277.         var link = articles[a];
  20278.         Zotero.Utilities.HTTP.doGet(link, function(text) {
  20279.             if (text.match(/doi:.*\"/)) var doi = text.match(/doi:(.*)\"/)[1];
  20280.             var id = text.match(/name=\"articles\"\s+value=\"([^"]+)\"/)[1];
  20281.             var action = text.match(/select\s+name=\"([^"]+)\"/)[1];
  20282.             var get = ''http://www.opticsinfobase.org/custom_tags/IB_Download_Citations.cfm'';
  20283.             var post = ''articles='' + id + ''&ArticleAction=save_endnote2&'' + action + ''=save_endnote2'';
  20284.             Zotero.Utilities.HTTP.doPost(get, post, function(text) {
  20285.                 var translator = Zotero.loadTranslator("import");
  20286.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20287.                 translator.setString(text);
  20288.                 translator.setHandler("itemDone", function(obj, item) {
  20289.                     var pubName;
  20290.                     if (item.journalAbbreviation) {
  20291.                         pubName = item.journalAbbreviation;
  20292.                     } else {
  20293.                         pubName = item.publicationTitle;
  20294.                     }
  20295.                     if (doi) item.DOI = doi;
  20296.                     item.attachments = [{url:articles[a], title:pubName + " Snapshot", mimeType:"text/html"}];
  20297.                     item.complete();
  20298.                 });
  20299.                 translator.translate();
  20300.             });
  20301.         });
  20302.     }
  20303. }');
  20304.  
  20305.  
  20306. REPLACE INTO translators VALUES ('a1a97ad4-493a-45f2-bd46-016069de4162', '1.0.0b4.r1', '', '2009-01-06 21:05:00', 1, 100, 4, 'Optical Society of America', 'Michael Berkowitz and Eli Osherovich', 'https?://[^.]+\.(opticsinfobase|osa)\.org',
  20307. 'function detectWeb(doc, url) {
  20308.     var namespace = doc.documentElement.namespaceURI;
  20309.     var nsResolver = namespace ? function(prefix) {
  20310.         if (prefix == ''x'') return namespace; else return null;
  20311.     } : null;
  20312.     
  20313.     var searchpath = ''//div[@id="col2"]/p/strong/a'';
  20314.     if (doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20315.         return "multiple";
  20316.     } else if (url.indexOf("abstract.cfm") != -1) {
  20317.         return "journalArticle";
  20318.     }
  20319. }',
  20320. 'function doWeb(doc, url) {
  20321.     var namespace = doc.documentElement.namespaceURI;
  20322.     var nsResolver = namespace ? function(prefix) {
  20323.         if (prefix == ''x'') return namespace; else return null;
  20324.     } : null;
  20325.     var host = doc.location.host;
  20326.     var articles = new Array();
  20327.     if (detectWeb(doc, url) == "multiple") {
  20328.         var items = new Object();
  20329.         var xpath = ''//div[@id="col2"]/p/strong/a'';
  20330.         var arts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20331.         var next_art;
  20332.         while (next_art = arts.iterateNext()) {
  20333.             items[next_art.href] = Zotero.Utilities.trimInternal(next_art.textContent);
  20334.         }
  20335.         items = Zotero.selectItems(items);
  20336.         for (var i in items) {
  20337.             articles.push(i);
  20338.         }
  20339.     } else {
  20340.         articles = [url];
  20341.     }
  20342.     Zotero.Utilities.processDocuments(articles, function(newDoc) {
  20343.         var osalink = newDoc.evaluate(''//div[@id="abstract-header"]/p/a[contains(text(), "opticsinfobase")]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  20344.         var pdfpath = ''//div[@id="abstract-header"]/p/a[contains(text(), "Full Text")]'';
  20345.         var pdflink = newDoc.evaluate(pdfpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  20346.         var abstractblock = newDoc.evaluate(''//meta[@name="dc.description"]'', newDoc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  20347.         var identifierblock = newDoc.evaluate(''//meta[@name="dc.identifier"]'', newDoc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  20348.         Zotero.Utilities.HTTP.doGet(osalink, function(text) {
  20349.             var action = text.match(/select\s+name=\"([^"]+)\"/)[1];
  20350.             var id = text.match(/input\s+type=\"hidden\"\s+name=\"articles\"\s+value=\"([^"]+)\"/)[1];
  20351.             var get = ''http://'' + host + ''/custom_tags/IB_Download_Citations.cfm'';
  20352.             var post = ''articles='' + id + ''&ArticleAction=save_endnote2&'' + action + ''=save_endnote2'';
  20353.             Zotero.Utilities.HTTP.doPost(get, post, function(text) {
  20354.                 var translator = Zotero.loadTranslator("import");
  20355.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20356.                 translator.setString(text);
  20357.                 translator.setHandler("itemDone", function(obj, item) {
  20358.                     var pubName;
  20359.                     if (item.journalAbbreviation) {
  20360.                         pubName = item.journalAbbreviation;
  20361.                     } else {
  20362.                         pubName = item.publicationTitle;
  20363.                     }
  20364.                     if (identifierblock) {
  20365.                          if (/doi:(.*)$/.test(identifierblock.getAttribute(''content''))) {
  20366.                             item.DOI = RegExp.$1;
  20367.                         }
  20368.                     }
  20369.                     item.attachments = [{url:osalink, title:pubName + " Snapshot", mimeType:"text/html"}];
  20370.                     if (pdflink) {
  20371.                         item.attachments.push({url:pdflink.href, title:"OSA Journals PDF", mimeType:"application/pdf"});
  20372.                     }
  20373.  
  20374.                     if (abstractblock) {
  20375.                         item.abstractNote = abstractblock.getAttribute(''content'');
  20376.                     }
  20377.                     item.complete();
  20378.                 });
  20379.                 translator.translate();
  20380.             });
  20381.         });
  20382.     }, function() {Zotero.done;});
  20383. }');
  20384.  
  20385.  
  20386. REPLACE INTO translators VALUES ('b61c224b-34b6-4bfd-8a76-a476e7092d43', '1.0.0b4.r5', '', '2009-01-28 18:10:00', 1, 100, 4, 'SSRN', 'Michael Berkowitz', 'http://papers\.ssrn\.com/',
  20387. 'function detectWeb(doc, url)    {
  20388.     var namespace=doc.documentElement.namespaceURI;
  20389.     var nsResolver=namespace?function(prefix)    {
  20390.         return (prefix=="x")?namespace:null;
  20391.     }:null;
  20392.     if (doc.evaluate(''//font/strong/a[substring(@class, 1, 4) = "text"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20393.         return "multiple";
  20394.     } else if (url.indexOf("abstract_id") != -1) {
  20395.         return "journalArticle";
  20396.     }
  20397. }',
  20398. 'function doWeb(doc, url) {
  20399.     var namespace=doc.documentElement.namespaceURI;
  20400.     var nsResolver=namespace?function(prefix)    {
  20401.         return (prefix=="x")?namespace:null;
  20402.     }:null;
  20403.     
  20404.     var uris = new Array();
  20405.     
  20406.     if (doc.evaluate(''//font/strong/a[substring(@class, 1, 4) = "text"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20407.         var items = new Object();
  20408.         var xpath = ''//font/strong/a[substring(@class, 1, 4) = "text"]'';
  20409.         var titles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20410.         var next_title = titles.iterateNext();
  20411.         while (next_title) {
  20412.             items[next_title.href] = next_title.textContent;
  20413.             next_title = titles.iterateNext();
  20414.         }
  20415.         items = Zotero.selectItems(items);
  20416.         for (var i in items) {
  20417.             uris.push(i);
  20418.         }
  20419.     } else {
  20420.         uris.push(url);
  20421.     }
  20422.     
  20423.     Zotero.Utilities.processDocuments(uris, function(doc) {
  20424.         if (doc.evaluate(''//span[@id="knownuser"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20425.             var id = doc.location.href.match(/abstract_id=(\d+)/)[1];
  20426.             if (doc.evaluate(''//a[@title="Download from Social Science Research Network"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20427.                 var pdfurl = doc.evaluate(''//a[@title="Download from Social Science Research Network"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  20428.             }
  20429.             var newURL = ''http://papers.ssrn.com/sol3/RefExport.cfm?abstract_id='' + id + ''&format=3'';
  20430.             Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  20431.                 var ris=text.match(/<input type=\"Hidden\"\s+name=\"hdnContent\"\s+value=\"([^"]*)\">/)[1];
  20432.                 var trans=Zotero.loadTranslator("import");
  20433.                 trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20434.                 trans.setString(ris);
  20435.                 trans.setHandler("itemDone", function(obj, item) {
  20436.                     item.itemType = "journalArticle";
  20437.                     var tags = new Array();
  20438.                     for each (var tag in item.tags) {
  20439.                         var newtags = tag.split(",");
  20440.                         for each (var newtag in newtags) tags.push(newtag);
  20441.                     }
  20442.                     item.tags = tags;
  20443.                     item.attachments = [{url:item.url, title:"SSRN Snapshot", mimeType:"text/html"}];
  20444.                     if (pdfurl) item.attachments.push({url:pdfurl, title:"SSRN Full Text PDF", mimeType:"application/pdf"});
  20445.                     item.complete();
  20446.                 });
  20447.                 trans.translate();
  20448.             });
  20449.         } else {
  20450.             var item = new Zotero.Item("journalArticle");
  20451.             item.title = Zotero.Utilities.capitalizeTitle(Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="abstractTitle"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent));
  20452.             var authors = doc.evaluate(''//center/font/a[@class="textlink"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  20453.             var author;
  20454.             while (author = authors.iterateNext()) {
  20455.                 var aut = Zotero.Utilities.capitalizeTitle(Zotero.Utilities.trimInternal(author.textContent));
  20456.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  20457.             }
  20458.             item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="innerWhite"]/font[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10);
  20459.             var tags = doc.evaluate(''//font[contains(./b/text(), "Key")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  20460.             if (tags) {
  20461.                 item.tags = Zotero.Utilities.trimInternal(tags.textContent).substr(10).split(/,\s+/);
  20462.             }
  20463.             item.publicationTitle = "SSRN eLibrary";
  20464.             
  20465.             var date = doc.evaluate(''id("innerWhite")/center/font[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();            
  20466.             if (date && date.textContent.match(/\d{4}/)) {
  20467.                 item.date = Zotero.Utilities.trimInternal(date.textContent);
  20468.             }
  20469.             item.url = doc.location.href;
  20470.             /* Commenting out PDF downloading until we add referer capability
  20471.             var pdfurl = doc.evaluate(''//a[contains(@href,"pdf")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  20472.             if (pdfurl) {
  20473.                 pdfurl = pdfurl.href;
  20474.             }
  20475.             */
  20476.             item.attachments = [{url:item.url, title:"SSRN Snapshot", mimeType:"text/html"}];
  20477.             if (pdfurl) {
  20478.                 item.attachments.push({url:pdfurl, title:"SSRN Full Text PDF", mimeType:"application/pdf"});
  20479.             }
  20480.             item.complete();
  20481.         }
  20482.     }, function() {Zotero.done();});
  20483.     Zotero.wait();
  20484. }');
  20485.  
  20486.  
  20487. REPLACE INTO translators VALUES ('1c34744d-690f-4cac-b31b-b7f0c90ac14d', '1.0.0b3.r1', '', '2007-12-21 16:00:00', '0', '100', '4', 'RSC Publishing', 'Ramesh Srigiriraju', 'http://(:?www\.|google\.)?rsc\.org/', 
  20488. 'function detectWeb(doc, url)    {
  20489.     var namespace=doc.documentElement.namespaceURI;
  20490.     var nsResolver=namespace?function(prefix)    {
  20491.         return (prefix=="x")?namespace:null;
  20492.     }:null;
  20493.     var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
  20494.     if(journalreg.test(url))    {
  20495.         var browspath=''//div/p/a[text()="Use advanced search"]'';
  20496.         if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20497.             return "multiple";
  20498.         var searchpath=''//a[text()="Back to Search Form"]'';
  20499.         if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20500.             return "multiple";
  20501.         var singpath=''//ul/li/a[text()="HTML Article" or text()="PDF"]'';
  20502.         if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20503.             return "journalArticle";
  20504.     }
  20505.     var magpath=''//div/h3[text()="Link to journal article"]'';
  20506.     if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20507.         return "magazineArticle";
  20508.     var magbrows=''//div/h4[@class="newstitle"]/a'';
  20509.     if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20510.         return "multiple";
  20511.     var magsearch=''//p[@class="more"]/strong/a[text()="Search RSC journals"]'';
  20512.     if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20513.         return "multiple";
  20514.     var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
  20515.     if(bookreg.test(url))    {
  20516.         var pagepath=''//title/text()'';
  20517.         var page=doc.evaluate(pagepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20518.         if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
  20519.             ||(page=="Book Series"))
  20520.                 return "multiple";
  20521.         var chappath=''//dt/img[@alt="Chapter"]'';
  20522.         var singpath=''//h3[text()="Table of Contents"]'';
  20523.         if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20524.             return "bookSection";
  20525.         else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20526.             return "book";
  20527.     }
  20528.     var searchpath=''//div/p[@class="title"][text()="Search Results"]'';
  20529.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20530.         return "multiple";
  20531. }', 
  20532. 'function doChap(newItem, chaptext)    {
  20533.     var chapdata=chaptext.split("<br>");
  20534.     for(var pos=chapdata.length-2; pos>=0; pos--)    {
  20535.         chapdata[pos]=Zotero.Utilities.cleanTags(chapdata[pos]);
  20536.         if(chapdata[pos].indexOf("Editors")!=-1)    {
  20537.             var editors=chapdata[pos].split(",");
  20538.             for(var i=0; i<=editors.length-1; i++)    {
  20539.                 editors[i]=Zotero.Utilities.cleanString(editors[i]);
  20540.                 var names=editors[i].split(" ");
  20541.                 var creators=new Array();
  20542.                 if(i==0)
  20543.                     creators.firstName=names[1];
  20544.                 else
  20545.                     creators.firstName=names[0];
  20546.                 creators.lastName=names[names.length-1];
  20547.                 creators.creatorType="editor";
  20548.                 newItem.creators.push(creators);
  20549.             }
  20550.         }
  20551.         if(chapdata[pos].indexOf("Authors")!=-1)    {
  20552.             var authors=chapdata[pos].split(",");
  20553.             for(var i=0; i<=authors.length-1; i++)    {
  20554.                 authors[i]=Zotero.Utilities.cleanString(authors[i]);
  20555.                 var names=authors[i].split(" ");
  20556.                 var creators=new Array();
  20557.                 if(i==0)
  20558.                     creators.firstName=names[1];
  20559.                 else
  20560.                     creators.firstName=names[0];
  20561.                 creators.lastName=names[names.length-1];
  20562.                 creators.creatorType="editor";
  20563.                 newItem.creators.push(creators);
  20564.             }
  20565.         }
  20566.         if(chapdata[pos].indexOf("DOI")!=-1)
  20567.             newItem.itemID=chapdata[pos].substring(chapdata[pos].indexOf("1"));
  20568.         if(chapdata[pos].indexOf("Book")!=-1)
  20569.             newItem.bookTitle=chapdata[pos].substring(chapdata[pos].indexOf(" ")+1);
  20570.     }
  20571. }
  20572. function doBook(newItem, bookdata)    {
  20573.     var fields=bookdata.split("<br>");
  20574.     for(var pos=fields.length-2; pos>=0; pos--)    {
  20575.         fields[pos]=Zotero.Utilities.cleanTags(fields[pos]);
  20576.         if(fields[pos].indexOf("Volume")!=-1)    {
  20577.             var i=fields[pos].lastIndexOf(";");
  20578.             var vol;
  20579.             if(i!=-1)
  20580.                 vol=fields[pos].substring(i+1);
  20581.             else
  20582.                 vol=fields[pos].substring(fields[pos].lastIndexOf(" "));
  20583.             newItem.volume=Zotero.Utilities.cleanString(vol);
  20584.         }
  20585.         if(fields[pos].indexOf("Edition")!=-1)    {
  20586.             var i=fields[pos].lastIndexOf(";");
  20587.             if(i!=-1)
  20588.                 ed=fields[pos].substring(i+1);
  20589.             else
  20590.                 ed=fields[pos].substring(fields[pos].lastIndexOf(" "));
  20591.             newItem.edition=Zotero.Utilities.cleanString(ed);
  20592.         }
  20593.         if(fields[pos].indexOf("Copyright")!=-1)    {
  20594.             var i=fields[pos].lastIndexOf(";");
  20595.             var date;
  20596.             if(i!=-1)
  20597.                 date=fields[pos].substring(i+1);
  20598.             else
  20599.                 date=fields[pos].substring(fields[pos].indexOf(":")+2);
  20600.             newItem.date=Zotero.Utilities.cleanString(date);
  20601.         }
  20602.         if(fields[pos].indexOf("ISBN")!=-1&&fields[pos].indexOf("print")!=-1)    {
  20603.             var i=fields[pos].lastIndexOf(";");
  20604.             var isbn;
  20605.             if(i!=-1)
  20606.                 isbn=fields[pos].substring(i+1);
  20607.             else
  20608.                 isbn=fields[pos].substring(fields[pos].indexOf(":")+2);
  20609.             newItem.ISBN=Zotero.Utilities.cleanString(isbn);
  20610.         }
  20611.         if(fields[pos].indexOf("Author")!=-1||fields[pos].indexOf("Editor")!=-1)    {
  20612.             var authors=fields[pos].split(",");
  20613.             for(var i=0; i<=authors.length-1; i++)    {
  20614.                 authors[i]=Zotero.Utilities.cleanString(authors[i]);
  20615.                 var names=authors[i].split(" ");
  20616.                 var creators=new Array();
  20617.                 creators.firstName=names[0];
  20618.                 creators.lastName=names[names.length-2];
  20619.                 if(names[names.length-1]=="(Editor)")
  20620.                     creators.creatorType="editor";
  20621.                 if(names[names.length-1]=="(Author)")
  20622.                     creators.creatorType="author";
  20623.                 newItem.creators.push(creators);
  20624.             }
  20625.         }
  20626.         if(fields[pos].indexOf("DOI:")!=-1)
  20627.             newItem.itemID=fields[pos].substring(fields[pos].indexOf("1"));
  20628.     }
  20629. }
  20630. function doWeb(doc, url)    {
  20631.     var namespace=doc.documentElement.namespaceURI;
  20632.     var nsResolver=namespace?function(prefix)    {
  20633.         return (prefix=="x")?namespace:null;
  20634.     }:null;
  20635.     var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
  20636.     if(journalreg.test(url))    {
  20637.         var browspath=''//div/p/a[text()="Use advanced search"]'';
  20638.         if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20639.             var doipath=''//p[strong/text()="DOI:"]/a/text()'';
  20640.             var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20641.             var titlpath=''//p/strong/a'';
  20642.             var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20643.             var items=new Array();
  20644.             var doi;
  20645.             while(doi=dois.iterateNext())
  20646.                 items[doi.nodeValue]=Zotero.Utilities.cleanString(titles.iterateNext().textContent);
  20647.             items=Zotero.selectItems(items);
  20648.             var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
  20649.             for(var codes in items)    {
  20650.                 var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
  20651.                 string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
  20652.                 Zotero.Utilities.HTTP.doGet(string, function(text)    {
  20653.                     var trans=Zotero.loadTranslator("import");
  20654.                     trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20655.                     // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
  20656.                     text = text.replace("Y1 -  ", "Y1  - ");
  20657.                     trans.setString(text);
  20658.                     trans.translate();
  20659.                     Zotero.done();    
  20660.                 });
  20661.             }
  20662.         }
  20663.         var searchpath=''//a[text()="Back to Search Form"]'';
  20664.         if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20665.             var doipath=''//p[strong/text()="DOI:"]/a/text()'';
  20666.             var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20667.             var titlpath=''//form/div/h5'';
  20668.             var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20669.             var title;
  20670.             var items=new Array();
  20671.             while(title=titles.iterateNext())
  20672.                 items[dois.iterateNext().nodeValue]=title.textContent;
  20673.             items=Zotero.selectItems(items);
  20674.             var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
  20675.             for(var codes in items)    {
  20676.                 var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
  20677.                 string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
  20678.                 Zotero.Utilities.HTTP.doGet(string, function(text)    {
  20679.                     var trans=Zotero.loadTranslator("import");
  20680.                     trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20681.                     // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
  20682.                     text = text.replace("Y1 -  ", "Y1  - ");
  20683.                     trans.setString(text);
  20684.                     trans.translate();
  20685.                     Zotero.done();
  20686.                 });
  20687.             }
  20688.         }
  20689.         var singpath=''//ul/li/a[text()="HTML Article" or text()="PDF"]'';
  20690.         if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20691.             var doipath=''//div/p[strong/text()="DOI:"]'';
  20692.             var text=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  20693.             var doi=text.substring(text.indexOf("/")+1);
  20694.             var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="+doi;
  20695.             string+="&type=refman";
  20696.             Zotero.Utilities.HTTP.doGet(string, function(text)    {
  20697.                 var trans=Zotero.loadTranslator("import");
  20698.                 trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  20699.                 // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
  20700.                 text = text.replace("Y1 -  ", "Y1  - ");                
  20701.                 trans.setString(text);
  20702.                 trans.setHandler("itemDone", function(obj, newItem)    {
  20703.                     var url2=newItem.url;
  20704.                     var stringy;
  20705.                     var archpath=''//div[h3/text()="Journals archive purchaser access"]'';
  20706.                     if(doc.evaluate(archpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20707.                         var stringy="http://www.rsc.org/ejarchive/";
  20708.                         stringy+=url2.substring(url2.lastIndexOf("/")+1)+".pdf";
  20709.                         newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
  20710.                     }
  20711.                     else    {
  20712.                         var stringy="http://www.rsc.org/delivery/_ArticleLinking/DisplayArticleForFree.cfm?doi=";
  20713.                         stringy+=url2.substring(url2.lastIndexOf("/")+1);
  20714.                         newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
  20715.                     }
  20716.                     newItem.complete();
  20717.                 });
  20718.                 trans.translate();
  20719.                 Zotero.done();
  20720.             });
  20721.         }
  20722.     }
  20723.     var magpath=''//div/h3[text()="Link to journal article"]'';
  20724.     if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20725.         var newItem=new Zotero.Item("magazineArticle");
  20726.         var titlpath=''//div/h2/div[@class="header"]/text()'';
  20727.         newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20728.         var authpath=''//em/text()'';
  20729.         var auth=doc.evaluate(authpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20730.         var authors=auth.split(",");
  20731.         if(newItem.title.indexOf("Interview")==-1)
  20732.             for(var i=0; i<=authors.length-1; i++)    {
  20733.                 authors[i]=Zotero.Utilities.cleanString(authors[i]);
  20734.                 var names=authors[i].split(" ");
  20735.                 var creator=new Array();
  20736.                 creator.firstName=names[0];
  20737.                 creator.lastName=names[names.length-1];
  20738.                 newItem.creators.push(creator);
  20739.             }
  20740.         var textpath=''//div[@id="content"]//text()'';
  20741.         var text=doc.evaluate(textpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20742.         var temp;
  20743.         while(temp=text.iterateNext())
  20744.             if(temp.nodeValue==newItem.title)    {
  20745.                 newItem.date=text.iterateNext().nodeValue;
  20746.                 break;
  20747.             }
  20748.         var datapath= ''//div[@id="breadcrumbs"]/ul/li/a/text()'';
  20749.         var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20750.         var prev;
  20751.         while(temp=data.iterateNext())    {
  20752.             if(temp.nodeValue.indexOf("Chemi")!=-1)
  20753.                 newItem.publication=temp.nodeValue;
  20754.             prev=temp;
  20755.         }
  20756.         newItem.issue=prev.nodeValue;
  20757.         newItem.complete();
  20758.     }
  20759.     var magbrows=''//div/h4[@class="newstitle"]/a'';
  20760.     if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20761.         var titlpath=''//h4[@class="newstitle"]/a'';
  20762.         var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20763.         var title;
  20764.         var items=new Array();
  20765.         while(title=titles.iterateNext())
  20766.             items[title.href]=title.textContent;
  20767.         items=Zotero.selectItems(items);
  20768.         for(var linx in items)    {
  20769.             var newItem=new Zotero.Item("magazineArticle");
  20770.             newItem.url=linx;
  20771.             newItem.title=items[linx];
  20772.             var datepath=''//div[h4/a/text()="''+items[linx]+''"]/h4[@class="datetext"]/text()'';
  20773.             newItem.date=doc.evaluate(datepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20774.             var datapath= ''//div[@id="breadcrumbs"]/ul/li/a/text()'';
  20775.             var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20776.             var prev;
  20777.             var temp;
  20778.             while(temp=data.iterateNext())    {
  20779.                 if(temp.nodeValue.indexOf("Chemi")!=-1)
  20780.                     newItem.publication=temp.nodeValue;
  20781.                 prev=temp;
  20782.             }
  20783.             if(prev.nodeValue!=newItem.publication)
  20784.                 newItem.issue=prev.nodeValue;
  20785.             newItem.complete();
  20786.         }
  20787.     }
  20788.     var magsearch=''//p[@class="more"]/strong/a[text()="Search RSC journals"]'';
  20789.     if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20790.         var titlpath=''//div/p/a'';
  20791.         var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20792.         titlpath=''//blockquote/p/a[span/@class="l"]'';
  20793.         var titles2=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null)
  20794.         var title;
  20795.         var items=new Array();
  20796.         while(title=titles.iterateNext())
  20797.             items[title.href]=title.textContent;
  20798.         while(title=titles2.iterateNext())
  20799.             items[title.href]=title.textContent;
  20800.         items=Zotero.selectItems(items);
  20801.         for(var linx in items)    {
  20802.             var newItem=new Zotero.Item("magazineArticle");
  20803.             newItem.url=linx;
  20804.             newItem.title=items[linx];
  20805.             newItem.complete();
  20806.         }
  20807.     }
  20808.     var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
  20809.     if(bookreg.test(url))    {
  20810.         var browspath=''//title/text()'';
  20811.         var page=doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20812.         if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
  20813.             ||(page=="Book Series"))    {
  20814.             var doipath=''//dd/p/a/text()'';
  20815.             var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20816.             var items=new Array();
  20817.             var title;
  20818.             while(title=dois.iterateNext())    {
  20819.                 var doi=dois.iterateNext().nodeValue;
  20820.                 items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
  20821.             }
  20822.             items=Zotero.selectItems(items);
  20823.             for(var codes in items)    {
  20824.                 var newItem=new Zotero.Item("book");
  20825.                 newItem.itemID=codes;
  20826.                 newItem.title=items[codes];
  20827.                 var itempath=''//dd/p[contains(a[2]/text(), "''+codes+''")]'';
  20828.                 var itempath2=''//dd/p[contains(a/text(), "''+codes+''")]'';
  20829.                 var data;
  20830.                 if(data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20831.                     data=data.innerHTML;
  20832.                 else if(data=doc.evaluate(itempath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  20833.                     data=data.innerHTML;
  20834.                 doBook(newItem, data);
  20835.                 newItem.complete();
  20836.             }    
  20837.         }
  20838.         var chappath=''//dt/img[@alt="Chapter"]'';
  20839.         var singpath=''//h3[text()="Table of Contents"]'';
  20840.         if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20841.             var newItem=new Zotero.Item("bookSection");
  20842.             var titlpath=''//span/h3/text()'';
  20843.             var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20844.             newItem.title=titles.iterateNext().nodeValue;
  20845.             newItem.bookTitle=titles.iterateNext().nodeValue;
  20846.             var datapath=''//dd/p'';
  20847.             var entries=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20848.             var chaptext=entries.iterateNext().innerHTML;
  20849.             doChap(newItem, chaptext);
  20850.             var bookdata=entries.iterateNext().innerHTML;
  20851.             doBook(newItem, bookdata);
  20852.             var linkpath=''//td[1][@class="td1"]/a[1]'';
  20853.             var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20854.             var pdflink;
  20855.             while(pdflink=linx.iterateNext())
  20856.                 newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
  20857.             newItem.complete();
  20858.         }
  20859.         else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20860.             var newItem=new Zotero.Item("book");
  20861.             var itempath=''//dd/p'';
  20862.             var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
  20863.             doBook(newItem, data);
  20864.             var titlpath=''//div/h2/text()'';
  20865.             newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20866.             var linkpath=''//td[1][@class="td1"]/a[1]'';
  20867.             var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20868.             var pdflink;
  20869.             while(pdflink=linx.iterateNext())
  20870.                 newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
  20871.             newItem.complete();
  20872.         }
  20873.     }
  20874.     var searchpath=''//div/p[@class="title"][text()="Search Results"]'';
  20875.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  20876.         var doipath=''//dd/p/a/text()'';
  20877.         var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  20878.         var title;
  20879.         var items=new Array();
  20880.         while(title=dois.iterateNext())    {
  20881.             var doi=dois.iterateNext().nodeValue;
  20882.             items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
  20883.         }
  20884.         items=Zotero.selectItems(items);
  20885.         for(var codes in items)    {
  20886.             var itempath=''//dd/p[contains(a/text(), "''+codes+''")]'';
  20887.             var newpath=''//dd[contains(p[2]/a/text(), "''+codes+''")]/p[1]/strong/text()'';
  20888.             var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
  20889.             if(data.indexOf("Book:")!=-1)    {
  20890.                 var newItem=new Zotero.Item("bookSection");
  20891.                 newItem.itemID=codes;
  20892.                 newItem.title=items[codes];
  20893.                 doChap(newItem, data);
  20894.                 newItem.complete();
  20895.             }
  20896.             else        {
  20897.                 var newItem=new Zotero.Item("book");
  20898.                 var newdata=doc.evaluate(newpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  20899.                 if(newdata.indexOf("Volume")!=-1)
  20900.                     newItem.volume=newdata.substring(newdata.lastIndexOf(" ")+1);
  20901.                 else
  20902.                     newItem.series=newdata;
  20903.                 newItem.itemID=codes;
  20904.                 newItem.title=items[codes];
  20905.                 doBook(newItem, data);
  20906.                 newItem.complete();
  20907.             }
  20908.         }
  20909.     }
  20910.     Zotero.wait();
  20911. }');
  20912.  
  20913.  
  20914. REPLACE INTO translators VALUES ('4fd6b89b-2316-2dc4-fd87-61a97dd941e8', '1.0.0b3.r1', '', '2008-10-28 02:50:00', 1, 200, 4, 'Library Catalog (InnoPAC)', 'Simon Kornblith and Michael Berkowitz', '(search~|\/search\?|(a|X|t|Y|w)\?|\?(searchtype|searchscope)|frameset&FF)',
  20915. 'function detectWeb(doc, url) {
  20916.     var namespace = doc.documentElement.namespaceURI;
  20917.     var nsResolver = namespace ? function(prefix) {
  20918.         if (prefix == ''x'') return namespace; else return null;
  20919.     } : null;
  20920.  
  20921. // Central Michigan University fix
  20922.     var xpath = ''//div[@class="bibRecordLink"]'';
  20923.     var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  20924.     if(elmt) {
  20925.         return "book";
  20926.     }
  20927.  
  20928. // possibly disastrous edit to regular expression below    
  20929.     if (!url.match(/SEARCH=/) && !url.match(/searchargs?=/) && !url.match(/&FF/)) return false;
  20930.     // First, check to see if the URL alone reveals InnoPAC, since some sites don''t reveal the MARC button
  20931.     var matchRegexp = new RegExp(''^https?://[^/]+/search[^/]*\\??/[^/]+/[^/]+/[^/]+\%2C[^/]+/frameset(.+)$'');
  20932.     if(matchRegexp.test(doc.location.href)) {
  20933.         if (!url.match("SEARCH") && !url.match("searchtype")) {
  20934.             return "book";
  20935.         }
  20936.     }
  20937.     // Next, look for the MARC button    
  20938.     xpath = ''//a[img[@src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]'';
  20939.     elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  20940.     if(elmt) {
  20941.         return "book";
  20942.     }
  20943.     // Also, check for links to an item display page
  20944.     var tags = doc.getElementsByTagName("a");
  20945.     for(var i=0; i<tags.length; i++) {
  20946.         if(matchRegexp.test(tags[i].href) || tags[i].href.match(/^https?:\/\/([^/]+\/(?:search\??\/|record=?|search%7e\/)|frameset&FF=)/)) {
  20947.             return "multiple";
  20948.         }
  20949.     }
  20950.     
  20951.     return false;
  20952. }',
  20953. 'function scrape(marc, newDoc) {
  20954.     var namespace = newDoc.documentElement.namespaceURI;
  20955.     var nsResolver = namespace ? function(prefix) {
  20956.       if (prefix == ''x'') return namespace; else return null;
  20957.     } : null;
  20958.     
  20959.     var xpath = ''//pre/text()'';
  20960.     if (newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  20961.         var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null);
  20962.         var useNodeValue = true;
  20963.     } else {
  20964.         var elmts = newDoc.evaluate(''//pre'', newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  20965.         var useNodeValue = false;
  20966.     }
  20967.     var elmt;
  20968.     while(elmt = elmts.iterateNext()) {
  20969.         if (useNodeValue) {
  20970.             var text = elmt.nodeValue;
  20971.         } else {
  20972.             var text = elmt.textContent;
  20973.         }
  20974.         var newItem = new Zotero.Item();
  20975.         var record = new marc.record();
  20976.         
  20977.         var linee = text.split("\n");
  20978.         for (var i=0; i<linee.length; i++) {
  20979.             if(!linee[i]) {
  20980.                 continue;
  20981.             }
  20982.             
  20983.             linee[i] = linee[i].replace(/[\xA0_\t]/g, " ");
  20984.             var value = linee[i].substr(7);
  20985.             
  20986.             if(linee[i].substr(0, 6) == "      ") {
  20987.                 // add this onto previous value
  20988.                 tagValue += value;
  20989.             } else {
  20990.                 if(linee[i].substr(0, 6) == "LEADER") {
  20991.                     // trap leader
  20992.                     record.leader = value;
  20993.                 } else {
  20994.                     if(tagValue) {    // finish last tag
  20995.                         tagValue = tagValue.replace(/\|(.)/g, marc.subfieldDelimiter+"$1");
  20996.                         if(tagValue[0] != marc.subfieldDelimiter) {
  20997.                             tagValue = marc.subfieldDelimiter+"a"+tagValue;
  20998.                         }
  20999.                         
  21000.                         // add previous tag
  21001.                         record.addField(tag, ind, tagValue);
  21002.                     }
  21003.                     
  21004.                     var tag = linee[i].substr(0, 3);
  21005.                     var ind  = linee[i].substr(4, 2);
  21006.                     var tagValue = value;
  21007.                 }
  21008.             }
  21009.         }
  21010.         if(tagValue) {
  21011.             tagValue = tagValue.replace(/\|(.)/g, marc.subfieldDelimiter+"$1");
  21012.             if(tagValue[0] != marc.subfieldDelimiter) {
  21013.                 tagValue = marc.subfieldDelimiter+"a"+tagValue;
  21014.             }
  21015.             
  21016.             // add previous tag
  21017.             record.addField(tag, ind, tagValue);
  21018.         }
  21019.         
  21020.         record.translate(newItem);
  21021.         
  21022.         var domain = newDoc.location.href.match(/https?:\/\/([^/]+)/);
  21023.         newItem.repository = domain[1]+" Library Catalog";
  21024.         
  21025.         newItem.complete();
  21026.     }
  21027. }
  21028.  
  21029. function pageByPage(marc, urls) {
  21030.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  21031.         scrape(marc, newDoc);
  21032.     }, function() { Zotero.done() });
  21033. }
  21034.  
  21035. function doWeb(doc, url) {
  21036.     var uri = doc.location.href;
  21037.     var newUri;
  21038.     // load translator for MARC
  21039.     var translator = Zotero.loadTranslator("import");
  21040.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  21041.     var marc = translator.getTranslatorObject();
  21042.     var namespace = doc.documentElement.namespaceURI;
  21043.     var nsResolver = namespace ? function(prefix) {
  21044.         if (prefix == ''x'') return namespace; else return null;
  21045.     } : null;
  21046.     
  21047.     if (detectWeb(doc, url) == "book") {
  21048.         var matchRegexp = new RegExp(''^(.*)frameset(.+)$'');
  21049.         var m = matchRegexp.exec(uri);
  21050.         if (m) {
  21051.             newUri = uri.replace(/frameset/, "marc");
  21052.         } else {
  21053.             newUri = doc.evaluate(''//a[contains(@href, "frameset")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace(/frameset/, ''marc'');
  21054.         }
  21055.         pageByPage(marc, [newUri]);
  21056.     } else {    // Search results page
  21057.         // Require link to match this
  21058.         var tagRegexp = new RegExp();
  21059.         tagRegexp.compile(''^https?://[^/]+/search\\??/[^/]+/[^/]+/[0-9]+\%2C[^/]+/frameset'');
  21060.         
  21061.         var urls = new Array();
  21062.         var availableItems = new Array();
  21063.         var firstURL = false;
  21064.         
  21065.         var tableRows = doc.evaluate(''//table[@class="browseScreen"]//tr[@class="browseEntry" or @class="briefCitRow" or td/input[@type="checkbox"] or td[contains(@class,"briefCitRow")]]'',
  21066.                                      doc, nsResolver, XPathResult.ANY_TYPE, null);
  21067.         // Go through table rows
  21068.         var i = 0;
  21069.         while(tableRow = tableRows.iterateNext()) {
  21070.             // get link
  21071.             var links = doc.evaluate(''.//span[@class="briefcitTitle"]/a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  21072.             var link = links.iterateNext();
  21073.             if(!link) {
  21074.                 var links = doc.evaluate(".//a", tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  21075.                 link = links.iterateNext();
  21076.             }
  21077.             
  21078.             if(link) {
  21079.                 if(availableItems[link.href]) {
  21080.                     continue;
  21081.                 }
  21082.                     
  21083.                 
  21084.                 // Go through links
  21085.                 while(link) {
  21086.                     if (link.textContent.match(/\w+/)) availableItems[link.href] = link.textContent;
  21087.                     link = links.iterateNext();
  21088.                 }
  21089.                 i++;
  21090.             }
  21091.         };
  21092.         
  21093.         var items = Zotero.selectItems(availableItems);
  21094.         
  21095.         if(!items) {
  21096.             return true;
  21097.         }
  21098.         
  21099.         var newUrls = new Array();
  21100.         for(var url in items) {
  21101.             newUrls.push(url.replace("frameset", "marc"));
  21102.         }
  21103.         pageByPage(marc, newUrls);
  21104.     }
  21105.  
  21106.     Zotero.wait();
  21107. }');
  21108.  
  21109.  
  21110. REPLACE INTO translators VALUES ('add7c71c-21f3-ee14-d188-caf9da12728b', '1.0.0b3.r1', '', '2008-06-12 19:30:00', '1', '100', '4', 'Library Catalog (SIRSI)', 'Sean Takats', '/uhtbin/cgisirsi', 
  21111. 'function detectWeb(doc, url) {
  21112.     var namespace = doc.documentElement.namespaceURI;
  21113.     var nsResolver = namespace ? function(prefix) {
  21114.         if (prefix == ''x'') return namespace; else return null;
  21115.     } : null;
  21116.     
  21117.     
  21118.     var xpath = ''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'';
  21119.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21120.         Zotero.debug("SIRSI detectWeb: viewmarctags");
  21121.         return "book";
  21122.     }
  21123.     var xpath = ''//input[@name="VOPTIONS"]'';
  21124.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21125.         Zotero.debug("SIRSI detectWeb: VOPTIONS");
  21126.         return "book";
  21127.     }
  21128.     var elmts = doc.evaluate(''/html/body/form//text()'', doc, nsResolver,
  21129.                              XPathResult.ANY_TYPE, null);
  21130.     while(elmt = elmts.iterateNext()) {
  21131.         if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
  21132.             Zotero.debug("SIRSI detectWeb: Viewing record");
  21133.             return "book";
  21134.         }
  21135.     }
  21136.     
  21137.     var xpath = ''//td[@class="searchsum"]/table'';
  21138.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21139.         Zotero.debug("SIRSI detectWeb: searchsum");
  21140.         return "multiple";
  21141.     }
  21142.     var xpath = ''//form[@name="hitlist"]/table/tbody/tr'';
  21143.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21144.         Zotero.debug("SIRSI detectWeb: hitlist");
  21145.         return "multiple";
  21146.     }
  21147.     //    var xpath = ''//input[@type="checkbox"]''     
  21148. }', 
  21149. 'function scrape(doc) {
  21150.     var namespace = doc.documentElement.namespaceURI;
  21151.     var nsResolver = namespace ? function(prefix) {
  21152.         if (prefix == ''x'') return namespace; else return null;
  21153.     } : null;
  21154.     
  21155.     var xpath = ''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'';
  21156.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21157.     var elmt = elmts.iterateNext();
  21158.     if(!elmt) {
  21159.         return false;
  21160.     }
  21161.  
  21162.     var newItem = new Zotero.Item("book");
  21163.     newItem.extra = "";
  21164.     
  21165.     authors = [];
  21166.     while(elmt) {
  21167.         try {
  21168.             var node = doc.evaluate(''./TD[1]/A[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21169.             if(!node) {
  21170.                 var node = doc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21171.             }
  21172.             
  21173.             if(node) {
  21174.                 var casedField = Zotero.Utilities.superCleanString(doc.evaluate(''./TH[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  21175.                 field = casedField.toLowerCase();
  21176.                 var value = Zotero.Utilities.superCleanString(node.nodeValue);
  21177.                 if(field == "publisher") {
  21178.                     newItem.publisher = value;
  21179.                 } else if(field == "pub date") {
  21180.                     var re = /[0-9]+/;
  21181.                     var m = re.exec(value);
  21182.                     newItem.date = m[0];
  21183.                 } else if(field == "isbn") {
  21184.                     var re = /^[0-9](?:[0-9X]+)/;
  21185.                     var m = re.exec(value);
  21186.                     newItem.ISBN = m[0];
  21187.                 } else if(field == "title" || field == "t├¡tulo") {
  21188.                     var titleParts = value.split(" / ");
  21189.                     newItem.title = Zotero.Utilities.capitalizeTitle(titleParts[0]);
  21190.                 } else if(field == "publication info" || field == "publicaci├│n") {
  21191.                     var pubParts = value.split(" : ");
  21192.                     newItem.place = pubParts[0];
  21193.                     if (pubParts[1].match(/\d+/)) newItem.date = pubParts[1].match(/\d+/)[0];
  21194.                 } else if(field == "personal author" || field == "autor personal") {
  21195.                     if(authors.indexOf(value) == -1) {
  21196.                         value = value.replace(/(\(|\)|\d+|\-)/g, "");
  21197.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
  21198.                         authors.push(value);
  21199.                     }
  21200.                 } else if(field == "author"){        
  21201.                     if(authors.indexOf(value) == -1) { 
  21202.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
  21203.                         authors.push(value);
  21204.                     }
  21205.                 } else if(field == "added author") {
  21206.                     if(authors.indexOf(value) == -1) {
  21207.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "contributor", true));
  21208.                         authors.push(value);
  21209.                     }
  21210.                 } else if(field == "corporate author") {
  21211.                     if(authors.indexOf(value) == -1) {
  21212.                         newItem.creators.push({lastName:value, fieldMode:true});
  21213.                         authors.push(value);
  21214.                     }
  21215.                 } else if(field == "edition") {
  21216.                     newItem.edition = value;
  21217.                 } else if(field == "subject term" || field == "corporate subject" || field == "geographic term" || field == "subject") {
  21218.                     var subjects = value.split("--");
  21219.                     for(var i=0; i<subjects.length; i++) {
  21220.                         if(newItem.tags.indexOf(subjects[i]) == -1) {
  21221.                             newItem.tags.push(subjects[i]);
  21222.                         }
  21223.                     }
  21224.                 } else if(field == "personal subject") {
  21225.                     var subjects = value.split(", ");
  21226.                     var tag = value[0]+", "+value[1];
  21227.                     if(newItems.tag.indexOf(tag) == -1) {
  21228.                         newItem.tags.push(tag);
  21229.                     }
  21230.                 } else if(value && field != "http") {
  21231.                     newItem.extra += casedField+": "+value+"\n";
  21232.                 }
  21233.             }
  21234.         } catch (e) {}
  21235.         
  21236.         elmt = elmts.iterateNext();
  21237.     }
  21238.     
  21239.     if(newItem.extra) {
  21240.         newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
  21241.     }
  21242.     
  21243.     var callNumber = doc.evaluate(''//tr/td[1][@class="holdingslist"]/text()'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21244.     if(callNumber && callNumber.nodeValue) {
  21245.         newItem.callNumber = callNumber.nodeValue;
  21246.     }
  21247.     
  21248.     var domain = doc.location.href.match(/https?:\/\/([^/]+)/);
  21249.     newItem.repository = domain[1]+" Library Catalog";
  21250.     
  21251.     newItem.complete();
  21252.     return true;
  21253. }
  21254.  
  21255. function doWeb(doc, url){
  21256.     var namespace = doc.documentElement.namespaceURI;
  21257.     var nsResolver = namespace ? function(prefix) {
  21258.         if (prefix == ''x'') return namespace; else return null;
  21259.     } : null;
  21260.     
  21261.     var sirsiNew = true; //toggle between SIRSI -2003 and SIRSI 2003+
  21262.     var xpath = ''//td[@class="searchsum"]/table'';
  21263.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21264.         Zotero.debug("SIRSI doWeb: searchsum");
  21265.         sirsiNew = true;    
  21266.     } else if (doc.evaluate(''//form[@name="hitlist"]/table/tbody/tr'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21267.         Zotero.debug("SIRSI doWeb: hitlist");
  21268.         sirsiNew = false;
  21269.     } else if (doc.evaluate(''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21270.         Zotero.debug("SIRSI doWeb: viewmarctags");
  21271.         sirsiNew = true;
  21272.     } else if (doc.evaluate(''//input[@name="VOPTIONS"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21273.         Zotero.debug("SIRSI doWeb: VOPTIONS");
  21274.         sirsiNew = false;
  21275.     } else {
  21276.     var elmts = doc.evaluate(''/html/body/form//text()'', doc, nsResolver,
  21277.                              XPathResult.ANY_TYPE, null);
  21278.         while(elmt = elmts.iterateNext()) {
  21279.             if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
  21280.                 Zotero.debug("SIRSI doWeb: Viewing record");
  21281.                 sirsiNew = false;
  21282.             }
  21283.         }
  21284.     }
  21285.     
  21286.     if (sirsiNew) { //executes Simon''s SIRSI 2003+ scraper code
  21287.         Zotero.debug("Running SIRSI 2003+ code");
  21288.         if(!scrape(doc)) {
  21289.             
  21290.             var checkboxes = new Array();
  21291.             var urls = new Array();
  21292.             var availableItems = new Array();            
  21293.             //begin IUCAT fixes by Andrew Smith
  21294.             var iuRe = /^https?:\/\/www\.iucat\.iu\.edu/;
  21295.             var iu = iuRe.exec(url);
  21296.             //IUCAT fix 1 of 2
  21297.             if (iu){
  21298.                 var tableRows = doc.evaluate(''//td[@class="searchsum"]/table[//input[@class="submitLink"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  21299.             } else{
  21300.                 var tableRows = doc.evaluate(''//td[@class="searchsum"]/table[//input[@value="Details"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  21301.             }
  21302.             var tableRow = tableRows.iterateNext();        // skip first row
  21303.             // Go through table rows
  21304.             while(tableRow = tableRows.iterateNext()) {
  21305.                 //IUCAT fix 2 of 2
  21306.                 if (iu){
  21307.                     var input = doc.evaluate(''.//input[@class="submitLink"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21308.                     var text = doc.evaluate(''.//label/span'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  21309.                 } else {
  21310.                     var input = doc.evaluate(''.//input[@value="Details"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();                    
  21311.                     var text = doc.evaluate(''.//label/strong'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;                    
  21312.                 }
  21313.             //end IUCAT fixes by Andrew Smith
  21314.                 if(text) {
  21315.                     availableItems[input.name] = text;
  21316.                 }
  21317.             }        
  21318.             var items = Zotero.selectItems(availableItems);        
  21319.             if(!items) {
  21320.                 return true;
  21321.             }
  21322.             var hostRe = new RegExp("^http(?:s)?://[^/]+");
  21323.             var m = hostRe.exec(doc.location.href);
  21324.             Zotero.debug("href: " + doc.location.href);
  21325.             var hitlist = doc.forms.namedItem("hitlist");
  21326.             var baseUrl = m[0]+hitlist.getAttribute("action")+"?first_hit="+hitlist.elements.namedItem("first_hit").value+"&last_hit="+hitlist.elements.namedItem("last_hit").value;
  21327.             var uris = new Array();
  21328.             for(var i in items) {
  21329.                 uris.push(baseUrl+"&"+i+"=Details");
  21330.             }
  21331.             Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  21332.                 function() { Zotero.done() }, null);
  21333.             Zotero.wait();
  21334.         }    
  21335.     } else{  //executes Simon''s SIRSI -2003 translator code
  21336.         Zotero.debug("Running SIRSI -2003 code");
  21337.         var uri = doc.location.href;
  21338.         var recNumbers = new Array();
  21339.         var xpath = ''//form[@name="hitlist"]/table/tbody/tr'';
  21340.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21341.         var elmt = elmts.iterateNext();
  21342.         if(elmt) {    // Search results page
  21343.             var uriRegexp = /^http:\/\/[^\/]+/;
  21344.             var m = uriRegexp.exec(uri);
  21345.             var postAction = doc.forms.namedItem("hitlist").getAttribute("action");
  21346.             var newUri = m[0]+postAction.substr(0, postAction.length-1)+"40";
  21347.             var titleRe = /<br>\s*(.*[^\s])\s*<br>/i;
  21348.             var items = new Array();
  21349.             do {
  21350.                 var checkbox = doc.evaluate(''.//input[@type="checkbox"]'', elmt, nsResolver,
  21351.                                             XPathResult.ANY_TYPE, null).iterateNext();
  21352.                 // Collect title
  21353.                 var title = doc.evaluate("./td[2]", elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  21354.                 if(checkbox && title) {
  21355.                     items[checkbox.name] = Zotero.Utilities.cleanString(title);
  21356.                 }
  21357.             } while(elmt = elmts.iterateNext());
  21358.             items = Zotero.selectItems(items);
  21359.             
  21360.             if(!items) {
  21361.                 return true;
  21362.             }
  21363.             
  21364.             for(var i in items) {
  21365.                 recNumbers.push(i);
  21366.             }
  21367.         } else {        // Normal page
  21368.             // this regex will fail about 1/100,000,000 tries
  21369.             var uriRegexp = /^((.*?)\/([0-9]+?))\//;
  21370.             var m = uriRegexp.exec(uri);
  21371.             var newUri = m[1]+"/40"
  21372.             
  21373.             var elmts = doc.evaluate(''/html/body/form'', doc, nsResolver,
  21374.                                      XPathResult.ANY_TYPE, null);
  21375.             while(elmt = elmts.iterateNext()) {
  21376.                 var initialText = doc.evaluate(''.//text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21377.                 if(initialText && initialText.nodeValue && Zotero.Utilities.superCleanString(initialText.nodeValue) == "Viewing record") {
  21378.                     recNumbers.push(doc.evaluate(''./b[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  21379.                     break;
  21380.                 }
  21381.             }    
  21382.             // begin Emory compatibility
  21383.             var elmts = doc.evaluate(''//input[@name="first_hit"]'', doc, nsResolver,
  21384.                                      XPathResult.ANY_TYPE, null);
  21385.             while (elmt = elmts.iterateNext()) {
  21386.                 recNumbers.length = 0;
  21387.                 var recNumber = elmt.value;
  21388.                 recNumbers.push(recNumber);
  21389.                 break;
  21390.              }
  21391.             // end Emory compatibility    
  21392.         }
  21393.         var translator = Zotero.loadTranslator("import");
  21394.         translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  21395.         var marc = translator.getTranslatorObject();
  21396.         Zotero.Utilities.loadDocument(newUri+''?marks=''+recNumbers.join(",")+''&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type='', function(doc) {
  21397.             var pre = doc.getElementsByTagName("pre");
  21398.             var text = pre[0].textContent;
  21399.             var documents = text.split("*** DOCUMENT BOUNDARY ***");
  21400.             for(var j=1; j<documents.length; j++) {
  21401.                 var uri = newUri+"?marks="+recNumbers[j]+"&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=";
  21402.                 var lines = documents[j].split("\n");
  21403.                 var record = new marc.record();
  21404.                 var tag, content;
  21405.                 var ind = "";
  21406.                 for(var i=0; i<lines.length; i++) {
  21407.                     var line = lines[i];
  21408.                     if(line[0] == "." && line.substr(4,2) == ". ") {
  21409.                         if(tag) {
  21410.                             content = content.replace(/\|([a-z])/g, marc.subfieldDelimiter+"$1");
  21411.                             record.addField(tag, ind, content);
  21412.                         }
  21413.                     } else {
  21414.                         content += " "+line.substr(6);
  21415.                         continue;
  21416.                     }
  21417.                     tag = line.substr(1, 3);    
  21418.                     if(tag[0] != "0" || tag[1] != "0") {
  21419.                         ind = line.substr(6, 2);
  21420.                         content = line.substr(8);
  21421.                     } else {
  21422.                         content = line.substr(7);
  21423.                         if(tag == "000") {
  21424.                             tag = undefined;
  21425.                             record.leader = "00000"+content;
  21426.                             Zotero.debug("the leader is: "+record.leader);
  21427.                         }
  21428.                     }
  21429.                 }    
  21430.                 var newItem = new Zotero.Item();
  21431.                 record.translate(newItem);
  21432.                 
  21433.                 var domain = url.match(/https?:\/\/([^/]+)/);
  21434.                 newItem.repository = domain[1]+" Library Catalog";
  21435.  
  21436.                 newItem.complete();
  21437.             }
  21438.             Zotero.done();
  21439.         });
  21440.         Zotero.wait();    
  21441.     }
  21442. }');
  21443.  
  21444. REPLACE INTO translators VALUES ('a77690cf-c5d1-8fc4-110f-d1fc765dcf88', '1.0.0b3.r1', '', '2008-09-22 21:30:00', '1', '100', '4', 'ProQuest', 'Simon Kornblith', '^https?://[^/]+/(pqdlink|pqdweb)\?((?:.*\&)?did=.*&Fmt=[0-9]|(?:.*\&)Fmt=[0-9].*&did=|(?:.*\&)searchInterface=|(?:.*\&)TS=[0-9])', 
  21445. 'function detectWeb(doc, url) {
  21446.     var namespace = doc.documentElement.namespaceURI;
  21447.     var nsResolver = namespace ? function(prefix) {
  21448.         if (prefix == ''x'') return namespace; else return null;
  21449.     } : null;
  21450.            
  21451.     if(doc.evaluate(''//img[substring(@src, string-length(@src)-32) = "/images/common/logo_proquest.gif" or substring(@src, string-length(@src)-38) = "/images/common/logo_proquest_small.gif"]'',
  21452.                     doc, nsResolver, XPathResult.ANY_TYPE, null)) {    
  21453.                         
  21454.         
  21455.         var xpath = ''//table[@id="tableIndexTerms"]/tbody/tr/td[@class="textSmall"]'';
  21456.         var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21457.         var aitem;
  21458.         var source;
  21459.         while(aitem = data.iterateNext()) {
  21460.             source=aitem.textContent;
  21461.             if(source=="Source type:") {
  21462.                 source=data.iterateNext().textContent;
  21463.                 Zotero.debug("Item Source Type: "+source);
  21464.                 break;
  21465.             }
  21466.         }        
  21467.                     
  21468.         if(doc.title == "Results") {
  21469.             return "multiple";
  21470.         } else if(doc.title == "Document View") {
  21471.             switch (source) {
  21472.                 case ''Dissertation'':
  21473.                     return "thesis";
  21474.                     break;
  21475.                 case ''Historical Newspaper'':
  21476.                 case ''Newspaper'':
  21477.                     return "newspaperArticle";
  21478.                 default:
  21479.                     return "journalArticle";
  21480.                     break;
  21481.             }
  21482.             
  21483.         }
  21484.     }
  21485. }
  21486.  
  21487. //^https?://[^/]+/pqdweb\?((?:.*\&)?did=.*&Fmt=[0-9]|(?:.*\&)Fmt=[0-9].*&did=|(?:.*\&)searchInterface=)', 
  21488. 'function parseRIS(uris) {
  21489.     Zotero.Utilities.HTTP.doGet(uris, function(text, xmlhttp, url){    
  21490.         // load translator for RIS
  21491.         if(url.match("exportFormat=1")=="exportFormat=1") {
  21492.             var translator = Zotero.loadTranslator("import");
  21493.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  21494.             // Strip lines with just whitespace, which mess up RIS parsing
  21495.             text = text.replace(/^\s*$\n/gm, '''');
  21496.             translator.setString(text);
  21497.  
  21498.             //Set Handler fixes anomaly in Proquest RIS format. Properly formats author name as [last name], [first name]
  21499.             translator.setHandler("itemDone", function(obj, item) {
  21500.                 var cre = new Array();
  21501.                 cre = item.creators;
  21502.                 for each(var e in cre) {
  21503.     
  21504.                     if(!e[''firstName'']) {
  21505.                         //check if there is a first name, if not, take the first word in the last name
  21506.                         var names = e[''lastName''].split(" ");
  21507.                         e[''firstName'']=names[0];
  21508.                         e[''lastName'']="";
  21509.                         for(var i = 1; i<names.length; i++) {
  21510.                             e[''lastName'']+=names[i];
  21511.                         }
  21512.                     }
  21513.                 }
  21514.                 if (item.publicationTitle) item.publicationTitle = Zotero.Utilities.trimInternal(item.publicationTitle.replace(/\([\d\-]+\)/g, ""));
  21515.                 item.complete();
  21516.             });
  21517.         
  21518.             translator.translate();
  21519.             Zotero.done();
  21520.         }
  21521.         
  21522.     }, function() {});
  21523.     Zotero.wait();
  21524. }
  21525.  
  21526. function doWeb(doc, url) {
  21527.     var namespace = doc.documentElement.namespaceURI;
  21528.     var nsResolver = namespace ? function(prefix) {
  21529.         if (prefix == ''x'') return namespace; else return null;
  21530.     } : null;
  21531.     
  21532.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  21533.     var hMatch = hostRegexp.exec(url);
  21534.     var host = hMatch[1];
  21535.     
  21536.  
  21537.     
  21538.     if(doc.evaluate(''//img[substring(@src, string-length(@src)-32) = "/images/common/logo_proquest.gif" or substring(@src, string-length(@src)-38) = "/images/common/logo_proquest_small.gif"]'',
  21539.                         doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  21540.             if(doc.title == "Results") {
  21541.                 
  21542.                 //Get Client ID
  21543.                 var xpath = ''//a'';
  21544.                 var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21545.                 var aitem;
  21546.                 var clientID;
  21547.                 while(aitem = data.iterateNext()) {
  21548.                     clientID=aitem.href;
  21549.                     if(clientID.indexOf("clientId")!=-1) {
  21550.                         clientID = clientID.substr(clientID.indexOf("clientId")+9,clientID.length);
  21551.                         break;
  21552.                     }
  21553.                 }        
  21554.                 
  21555.                 var multXpath = ''//input[@name="chk"][@type="checkbox"]'';
  21556.                 var titleXpath = ''//a[@class="bold"]'';
  21557.                 var mInfos = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21558.                 var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21559.                 var titleElmt;
  21560.                 var mInfo;
  21561.                 mInfo = mInfos.iterateNext();
  21562.                 titleElmt = titleElmts.iterateNext();
  21563.  
  21564.                 var items = new Array();
  21565.  
  21566.                 do {
  21567.                     //Get item ID
  21568.                     
  21569.                     var str= mInfo.value;
  21570.                     str= str.replace("retrieveGroup", "sid");
  21571.                     var url = host+"/pqdweb?RQT=530&markedListInfo="+str+"1";
  21572.                     items[url] = Zotero.Utilities.trimInternal(titleElmt.textContent);
  21573.  
  21574.                 } while((mInfo = mInfos.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  21575.  
  21576.                 items = Zotero.selectItems(items);
  21577.                 if(!items) return true;
  21578.  
  21579.                 
  21580.                 //Array of URLs for the doGet
  21581.                 var uris = new Array();
  21582.                 
  21583.                 //Clear Basket
  21584.                 uris.push(host+"/pqdweb?RQT=531&clientId="+clientID);
  21585.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  21586.                 
  21587.                 //Add URLS to the basket
  21588.                 for(var bibcode in items) {
  21589.                     uris.push(bibcode);
  21590.                 }
  21591.                     
  21592.                 //Export basket as a RIS file
  21593.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  21594.                 uris.push(host+"/pqdweb?RQT=562&MRR=M&clientId="+clientID);
  21595.                 uris.push(host+"/pqdweb?RQT=562&exportFormat=1&clientId="+clientID);
  21596.                 
  21597.                 parseRIS(uris);
  21598.                 
  21599.             } else {
  21600.  
  21601.                 //Get Client ID
  21602.                 var xpath = ''//a'';
  21603.                 var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21604.                 var aitem;
  21605.                 var clientID;
  21606.                 while(aitem = data.iterateNext()) {
  21607.                     clientID=aitem.href;
  21608.                     if(clientID.indexOf("clientId")!=-1) {
  21609.                         clientID = clientID.substr(clientID.indexOf("clientId")+9,clientID.length);
  21610.                         break;
  21611.                     }
  21612.                 }        
  21613.                 
  21614.                 //Get item ID
  21615.                 var xpath = ''//input[@name="marked"][@type="checkbox"]'';
  21616.                 var str= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  21617.                 str= str.replace("retrieveGroup", "sid");
  21618.                 
  21619.                 //Array of URLs for the doGet
  21620.                 var uris = new Array();
  21621.                 
  21622.                 //Clear Basket
  21623.                 uris.push(host+"/pqdweb?RQT=531&clientId="+clientID);
  21624.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  21625.                 
  21626.                 //Create URL to add item to basket
  21627.                 url = host+"/pqdweb?RQT=530&markedListInfo="+str+"1";
  21628.                 Zotero.debug("RIS URL: "+url);
  21629.                 
  21630.                 uris.push(url);
  21631.                     
  21632.                 //Export basket as a RIS file
  21633.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  21634.                 uris.push(host+"/pqdweb?RQT=562&MRR=M&clientId="+clientID);
  21635.                 uris.push(host+"/pqdweb?RQT=562&exportFormat=1&clientId="+clientID);
  21636.                 
  21637.                 parseRIS(uris);
  21638.                 
  21639.             }
  21640.         }
  21641. }');
  21642.  
  21643. REPLACE INTO translators VALUES ('6773a9af-5375-3224-d148-d32793884dec', '1.0.0b3.r1', '', '2006-12-18 06:00:45', '1', '100', '4', 'InfoTrac', 'Simon Kornblith', '^https?://[^/]+/itw/infomark/', 
  21644. 'function detectWeb(doc, url) {
  21645.     var namespace = doc.documentElement.namespaceURI;
  21646.     var nsResolver = namespace ? function(prefix) {
  21647.         if (prefix == ''x'') return namespace; else return null;
  21648.     } : null;
  21649.     
  21650.     // ensure that there is an InfoTrac logo
  21651.     if(!doc.evaluate(''//img[substring(@alt, 1, 8) = "InfoTrac"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return false;
  21652.     
  21653.     if(doc.title.substring(0, 8) == "Article ") {
  21654.         var genre = doc.evaluate(''//comment()[substring(., 1, 6) = " Genre"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21655.         
  21656.         if(genre) {
  21657.             var value = Zotero.Utilities.cleanString(genre.nodeValue.substr(7));
  21658.             if(value == "article") {
  21659.                 return "journalArticle";
  21660.             } else if(value == "book") {
  21661.                 return "book";
  21662.             } else if(value == "dissertation") {
  21663.                 return "thesis";
  21664.             } else if(value == "bookitem") {
  21665.                 return "bookSection";
  21666.             }
  21667.         }
  21668.         
  21669.         return "magazineArticle";
  21670.     } else if(doc.title.substring(0, 10) == "Citations ") {
  21671.         return "multiple";
  21672.     }
  21673. }', 
  21674. 'function extractCitation(url, elmts, title, doc) {
  21675.     var newItem = new Zotero.Item();
  21676.     newItem.url = url;
  21677.     
  21678.     if(title) {
  21679.         newItem.title = Zotero.Utilities.superCleanString(title);
  21680.     }
  21681.     while(elmt = elmts.iterateNext()) {
  21682.         var colon = elmt.nodeValue.indexOf(":");
  21683.         var field = elmt.nodeValue.substring(1, colon).toLowerCase();
  21684.         var value = elmt.nodeValue.substring(colon+1, elmt.nodeValue.length-1);
  21685.         if(field == "title") {
  21686.             newItem.title = Zotero.Utilities.superCleanString(value);
  21687.         } else if(field == "journal") {
  21688.             newItem.publicationTitle = value;
  21689.         } else if(field == "pi") {
  21690.             parts = value.split(" ");
  21691.             var date = "";
  21692.             var field = null;
  21693.             for(j in parts) {
  21694.                 firstChar = parts[j].substring(0, 1);
  21695.                 
  21696.                 if(firstChar == "v") {
  21697.                     newItem.itemType = "journalArticle";
  21698.                     field = "volume";
  21699.                 } else if(firstChar == "i") {
  21700.                     field = "issue";
  21701.                 } else if(firstChar == "p") {
  21702.                     field = "pages";
  21703.                     
  21704.                     var pagesRegexp = /p(\w+)\((\w+)\)/;    // weird looking page range
  21705.                     var match = pagesRegexp.exec(parts[j]);
  21706.                     if(match) {            // yup, it''s weird
  21707.                         var finalPage = parseInt(match[1])+parseInt(match[2])
  21708.                         parts[j] = "p"+match[1]+"-"+finalPage.toString();
  21709.                     } else if(!newItem.itemType) {    // no, it''s normal
  21710.                         // check to see if it''s numeric, bc newspaper pages aren''t
  21711.                         var justPageNumber = parts[j].substr(1);
  21712.                         if(parseInt(justPageNumber).toString() != justPageNumber) {
  21713.                             newItem.itemType = "newspaperArticle";
  21714.                         }
  21715.                     }
  21716.                 } else if(!field) {    // date parts at the beginning, before
  21717.                                     // anything else
  21718.                     date += " "+parts[j];
  21719.                 }
  21720.                 
  21721.                 if(field) {
  21722.                     isDate = false;
  21723.                     
  21724.                     if(parts[j] != "pNA") {        // make sure it''s not an invalid
  21725.                                                 // page number
  21726.                         // chop of letter
  21727.                         newItem[field] = parts[j].substring(1);
  21728.                     } else if(!newItem.itemType) {        // only newspapers are missing
  21729.                                                         // page numbers on infotrac
  21730.                         newItem.itemType = "newspaperArticle";
  21731.                     }
  21732.                 }
  21733.             }
  21734.             
  21735.             // Set type
  21736.             if(!newItem.itemType) {
  21737.                 newItem.itemType = "magazineArticle";
  21738.             }
  21739.             
  21740.             if(date != "") {
  21741.                 newItem.date = date.substring(1);
  21742.             }
  21743.         } else if(field == "author") {
  21744.             var author = Zotero.Utilities.cleanAuthor(value, "author", true);
  21745.             
  21746.             // ensure author is not already there
  21747.             var add = true;
  21748.             for each(var existingAuthor in newItem.creators) {
  21749.                 if(existingAuthor.firstName == author.firstName && existingAuthor.lastName == author.lastName) {
  21750.                     add = false;
  21751.                     break;
  21752.                 }
  21753.             }
  21754.             if(add) newItem.creators.push(author);
  21755.         } else if(field == "issue") {
  21756.             newItem.issue = value;
  21757.         } else if(field == "volume") {
  21758.             newItem.volume = value;
  21759.         } else if(field == "issn") {
  21760.             newItem.ISSN = value;
  21761.         } else if(field == "gjd") {
  21762.             var m = value.match(/\(([0-9]{4}[^\)]*)\)(?:, pp\. ([0-9\-]+))?/);
  21763.             if(m) {
  21764.                 newItem.date = m[1];
  21765.                 newItem.pages = m[2];
  21766.             }
  21767.         } else if(field == "BookTitle") {
  21768.             newItem.publicationTitle = value;
  21769.         } else if(field == "genre") {
  21770.             value = value.toLowerCase();
  21771.             if(value == "article") {
  21772.                 newItem.itemType = "journalArticle";
  21773.             } else if(value == "book") {
  21774.                 newItem.itemType = "book";
  21775.             } else if(value == "dissertation") {
  21776.                 newItem.itemType = "thesis";
  21777.             } else if(value == "bookitem") {
  21778.                 newItem.itemType = "bookSection";
  21779.             }
  21780.         }
  21781.     }
  21782.     
  21783.     if(doc) {
  21784.         newItem.attachments.push({document:doc, title:"InfoTrac Snapshot"});
  21785.     } else {
  21786.         newItem.attachments.push({url:url, title:"InfoTrac Snapshot",
  21787.                                  mimeType:"text/html"});
  21788.     }
  21789.     
  21790.     newItem.complete();
  21791. }
  21792.  
  21793. function doWeb(doc, url) {    
  21794.     var namespace = doc.documentElement.namespaceURI;
  21795.     var nsResolver = namespace ? function(prefix) {
  21796.         if (prefix == ''x'') return namespace; else return null;
  21797.     } : null;
  21798.  
  21799.     var uri = doc.location.href;
  21800.     if(doc.title.substring(0, 8) == "Article ") {    // article
  21801.         var xpath = ''/html/body//comment()'';
  21802.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21803.         extractCitation(uri, elmts);
  21804.     } else {                                        // search results
  21805.         var items = new Array();
  21806.         var uris = new Array();
  21807.         var elmts = new Array();
  21808.         
  21809.         var host = doc.location.href.match(/^https?:\/\/[^\/]+/)[0];
  21810.         
  21811.         var tableRows = doc.evaluate(''/html/body//table/tbody/tr/td[a/b]'', doc, nsResolver,
  21812.                                      XPathResult.ANY_TYPE, null);
  21813.         var tableRow;
  21814.         var javaScriptRe = /''([^'']*)'' *, *''([^'']*)''/
  21815.         var i = 0;
  21816.         // Go through table rows
  21817.         while(tableRow = tableRows.iterateNext()) {
  21818.             var link = doc.evaluate(''./a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21819.             var m = javaScriptRe.exec(link.href);
  21820.             if(m) {
  21821.                 uris[i] = host+"/itw/infomark/192/215/90714844w6"+m[1]+"?sw_aep=olr_wad"+m[2];
  21822.             }
  21823.             var article = doc.evaluate(''./b/text()'', link, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21824.             items[i] = article.nodeValue;
  21825.             // Chop off final period
  21826.             if(items[i].substr(items[i].length-1) == ".") {
  21827.                 items[i] = items[i].substr(0, items[i].length-1);
  21828.             }
  21829.             elmts[i] = doc.evaluate(".//comment()", tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  21830.             i++;
  21831.         }
  21832.         
  21833.         items = Zotero.selectItems(items);
  21834.         
  21835.         if(!items) {
  21836.             return true;
  21837.         }
  21838.         
  21839.         for(var i in items) {
  21840.             extractCitation(uris[i], elmts[i], items[i]);
  21841.         }
  21842.     }
  21843. }');
  21844.  
  21845. REPLACE INTO translators VALUES ('63c25c45-6257-4985-9169-35b785a2995e', '1.0.0b3.r1', '', '2006-12-15 03:40:00', 1, 100, 4, 'InfoTrac OneFile', 'Simon Kornblith', '^https?://[^/]+/itx/(?:[a-z]+Search|retrieve|paginate|tab)\.do',
  21846. 'function detectWeb(doc, url) {
  21847.     var namespace = doc.documentElement.namespaceURI;
  21848.     var nsResolver = namespace ? function(prefix) {
  21849.         if (prefix == ''x'') return namespace; else return null;
  21850.     } : null;
  21851.     
  21852.     if(doc.evaluate(''//img[@alt="Thomson Gale"]'', doc, nsResolver,
  21853.                     XPathResult.ANY_TYPE, null).iterateNext()) {
  21854.         if(doc.evaluate(''//table[@class="resultstable"][tbody/tr[@class="unselectedRow"]]'',
  21855.                         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21856.             return "multiple";
  21857.         } else {
  21858.             return "journalArticle";
  21859.         }
  21860.     }
  21861. }',
  21862. 'function infoTracRIS(text) {
  21863.     // load translator for RIS
  21864.     var translator = Zotero.loadTranslator("import");
  21865.     translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  21866.     translator.setString(text);
  21867.     translator.setHandler("itemDone", function(obj, item) {
  21868.         if(item.notes && item.notes[0]) {
  21869.             item.extra = item.notes[0].note;
  21870.             
  21871.             delete item.notes;
  21872.             item.notes = undefined;
  21873.         }
  21874.         
  21875.         // get underscored terms (term headings?) out of tags
  21876.         for(var i in item.tags) {
  21877.             var index = item.tags[i].indexOf("_");
  21878.             if(index != -1) {
  21879.                 item.tags[i] = item.tags[i].substr(0, index);
  21880.             }
  21881.         }
  21882.         
  21883.         // add names to attachments
  21884.         for(var i in item.attachments) {
  21885.             if(!item.attachments[i].title) {
  21886.                 item.attachments[i] = undefined;
  21887.             } else {
  21888.                 item.attachments[i].title = "InfoTrac OneFile "+item.attachments[i].title;
  21889.             }
  21890.         }
  21891.         
  21892.         //item.attachments = newAttachments.shift();
  21893.         //Zotero.debug(item.attachments);
  21894.         item.complete();
  21895.     });
  21896.     translator.translate();
  21897.     Zotero.done();
  21898. }
  21899.  
  21900. function readEncoded(url) {
  21901.     var newArray = new Array();
  21902.     
  21903.     var parts = url.split(/[?&]/);
  21904.     for each(var part in parts) {
  21905.         var index = part.indexOf("=");
  21906.         if(index !== -1) {
  21907.             newArray[part.substr(0, index)] = part.substr(index+1);
  21908.         }
  21909.     }
  21910.     
  21911.     return newArray;
  21912. }
  21913.  
  21914. function doWeb(doc, url) {
  21915.     var namespace = doc.documentElement.namespaceURI;
  21916.     var nsResolver = namespace ? function(prefix) {
  21917.         if (prefix == ''x'') return namespace; else return null;
  21918.     } : null;
  21919.     
  21920.     var hostRe = new RegExp("^https?://[^/]+/");
  21921.     var host = hostRe.exec(doc.location.href)[0];
  21922.     
  21923.     if(doc.evaluate(''//table[@class="resultstable"][tbody/tr[@class="unselectedRow"]]'',
  21924.                     doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  21925.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/itx/retrieve\\.do\\?.*docId='');
  21926.         items = Zotero.selectItems(items);
  21927.         
  21928.         if(!items) {
  21929.             return true;
  21930.         }
  21931.  
  21932.         // parse things out of URLs
  21933.         var time = new Date();
  21934.         time = time.getTime();
  21935.         var markedString = "";
  21936.         for(var i in items) {
  21937.             var postVal = readEncoded(i);
  21938.             markedString += postVal.tabID+"_"+postVal.docId+"_1_0_"+postVal.contentSet+"_srcprod="+postVal.prodId+"|^";
  21939.         }
  21940.         
  21941.         var postData = "inPS=true&ts="+time+"&prodId="+postVal.prodId+"&actionCmd=UPDATE_MARK_LIST&userGroupName="+postVal.userGroupName+"&markedString="+markedString+"&a="+time;
  21942.         Zotero.Utilities.HTTP.doGet(host+"itx/marklist.do?inPS=true&ts="+time+"&prodId="+postVal.prodId+"&actionCmd=CLEAR_MARK_LIST&userGroupName="+postVal.userGroupName,
  21943.                                      function(text) {            // clear marked
  21944.             Zotero.Utilities.HTTP.doPost(host+"itx/marklist.do", postData,
  21945.                                           function(text) {        // mark
  21946.                 Zotero.Utilities.HTTP.doGet(host+"itx/generateCitation.do?contentSet="+postVal.contentSet+"&inPS=true&tabID=T-ALL&prodId="+postVal.prodId+"&docId=&actionString=FormatCitation&userGroupName="+postVal.userGroupName+"&citationFormat=ENDNOTE",
  21947.                                              function(text) {    // get marked
  21948.                     infoTracRIS(text);
  21949.                 });
  21950.             });
  21951.         });
  21952.     } else {
  21953.         // just extract from single page
  21954.         var postVal = readEncoded(url);
  21955.         Zotero.Utilities.HTTP.doGet(host+"itx/generateCitation.do?contentSet="+postVal.contentSet+"&inPS=true&tabID="+postVal.tabID+"&prodId="+postVal.prodId+"&docId="+postVal.docId+"&actionString=FormatCitation&citationFormat=ENDNOTE",
  21956.                                      function(text) {
  21957.             infoTracRIS(text);
  21958.         });
  21959.     }
  21960.     
  21961.     Zotero.wait();
  21962. }');
  21963.  
  21964. REPLACE INTO translators VALUES ('b047a13c-fe5c-6604-c997-bef15e502b09', '1.0.0b3.r1', '', '2008-03-18 02:30:00', '1', '100', '4', 'LexisNexis', 'Sean Takats', 'https?://[^/]*lexis-?nexis\.com[^/]*/us/lnacademic', 
  21965. 'function detectWeb(doc, url) {
  21966.     var namespace = doc.documentElement.namespaceURI;
  21967.     var nsResolver = namespace ? function(prefix) {
  21968.         if (prefix == ''x'') return namespace; else return null;
  21969.     } : null;
  21970.     
  21971.     if (doc.title.substr(doc.title.length-8, 8)=="Document"){
  21972.         var xpath = ''//input[@name="cisb"]'';
  21973.         var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21974.         if (elmt.iterateNext()){
  21975.             return "newspaperArticle";
  21976.         }
  21977.     }
  21978.     var xpath = ''//input[@name="frm_tagged_documents" and @type="checkbox"]'';
  21979.     var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  21980.     if (elmt.iterateNext()){
  21981.         return "multiple";
  21982.     }
  21983. }', 
  21984. 'function doWeb(doc, url) {    
  21985.     var namespace = doc.documentElement.namespaceURI;
  21986.     var nsResolver = namespace ? function(prefix) {
  21987.         if (prefix == ''x'') return namespace; else return null;
  21988.     } : null;
  21989.  
  21990.     // define results navigation frame doc for export buttons and hidden fields
  21991.     var rfDoc = doc.defaultView.window.top.frames[1].document;
  21992.     var xpath = ''//img[@title="Export Bibliographic References"]'';    
  21993.  
  21994.     var elmt = doc.evaluate(xpath, rfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  21995.  
  21996.     var hostRe = new RegExp("^http(?:s)?://[^/]+");
  21997.     var m = hostRe.exec(doc.location.href);
  21998.     var host = m[0];
  21999.  
  22000.     var risb = doc.evaluate(''//input[@name="risb"]'', rfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  22001.     var cisb = doc.evaluate(''//input[@name="cisb"]'', rfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  22002.     var uri = host+"/us/lnacademic/results/listview/delPrep.do?cisb="+cisb+"&risb="+risb+"&mode=delivery_refworks";
  22003.     var hiddenInputs = doc.evaluate(''//form[@name="results_docview_DocumentForm"]//input[@type="hidden" and not(@name="tagData")]'', rfDoc, nsResolver,
  22004.         XPathResult.ANY_TYPE, null);
  22005.     var hiddenInput;
  22006.     var poststring="";
  22007.     while(hiddenInput = hiddenInputs.iterateNext()) {
  22008.         poststring = poststring+"&"+hiddenInput.name+"="+encodeURIComponent(hiddenInput.value);
  22009.     }
  22010.  
  22011.     var xpath = ''//input[@name="frm_tagged_documents" and @type="checkbox"]'';
  22012.     var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  22013.     if (doc.title.substr(doc.title.length-8, 8)=="Document"){
  22014.         // single page
  22015.         var delRange = "cur";
  22016.         poststring = poststring + "&hiddensearchfield=Narrow+Search&reloadClassif=&format=GNBFI&focusTerms=&nextSteps=0";
  22017.     } else {
  22018.         // get multiple item titles and tags
  22019.         var xpath = ''//tr[td/input[@name="frm_tagged_documents"]]'';
  22020.         var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  22021.         var title;
  22022.         var tagNumber;
  22023.         var items = new Object();
  22024.         while (row = rows.iterateNext()){
  22025.             title = doc.evaluate(''.//a'', row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  22026.             tagNumber = doc.evaluate(''./td/input[@name="frm_tagged_documents"]'', row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  22027.             items[tagNumber] = title;
  22028.         }        
  22029.         var tagData = "";
  22030.         items = Zotero.selectItems(items);
  22031.         if (!items) {
  22032.             return true;
  22033.         }
  22034.         for (var i in items) {
  22035.             tagData += "-"+i;
  22036.         }
  22037.         tagData = tagData.substr(1);
  22038.         var delRange = "tag";
  22039.         poststring = poststring + "&tagData=" + tagData + "&hiddensearchfield=Narrow+Search&reloadClassif=&selDomainID=4&format=GNBLIST&focusTerms=&sort=RELEVANCE&nextSteps=0";
  22040.     } 
  22041.     Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  22042.         uri = host+"/us/lnacademic/delivery/refExport.do";
  22043.         var disb = text.match(/<input type="hidden" name="disb" value="([^"]+)">/);
  22044.         poststring = "delRange="+delRange+"&selDocs=&disb="+disb[1]+"&initializationPage=0";
  22045.         Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  22046.             uri = text.match(/&url=([^'']+)''/)
  22047.             uri = decodeURIComponent(uri[1]);
  22048.             uri = uri.replace(/http:\/\/[^/]*\//, host+"/");
  22049.             var uris = new Array();
  22050.             uris.push(uri);
  22051.             Zotero.Utilities.processDocuments(uris, function(newDoc){
  22052.                 var elmts =newDoc.evaluate(''//html'', newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  22053.                 var elmt;
  22054.                 while (elmt = elmts.iterateNext()){
  22055.                     var newItem = new Zotero.Item("newspaperArticle");
  22056.                     var title = newDoc.evaluate(''.//div[@class="HEADLINE"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22057.                     if (title.textContent){
  22058.                         newItem.title = title.textContent;
  22059.                     }else{
  22060.                         newItem.title = " ";
  22061.                     }
  22062.                     var date = newDoc.evaluate(''.//meta[@name="_lndateissue"]/@content'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22063.                     if (date){
  22064.                         date = date.nodeValue;
  22065.                         var m = date.match(/([^T]+)T/);
  22066.                         date = m[1];
  22067.                         if (date.length == 8){
  22068.                             date = date.substr(0,4) + "-" + date.substr(4,2) + "-" + date.substr(6,2);
  22069.                         } else if (date.length == 6){
  22070.                             date = date.substr(0,4) + "-" + date.substr(4,2);
  22071.                         }
  22072.                         newItem.date = date;         
  22073.                     }
  22074.                     var publicationTitle = newDoc.evaluate(''.//div[@class="PUB"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22075.                     if (publicationTitle){
  22076.                         newItem.publicationTitle = publicationTitle.textContent;
  22077.                     }
  22078.                     var section = newDoc.evaluate(''.//div[@class="SECTION-INFO"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22079.                     if (section){
  22080.                         newItem.section = section.textContent;                
  22081.                     }
  22082.                     var author = newDoc.evaluate(''.//div[@class="BYLINE"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22083.                     if (author){
  22084.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author"));
  22085.                     }
  22086.                     newItem.repository = "lexisnexis.com";
  22087.                     newItem.url = url;
  22088.                     newItem.complete()
  22089.                 }
  22090.                 Zotero.done();
  22091.             });
  22092.         });
  22093.     });
  22094.     Zotero.wait();
  22095. }');
  22096.  
  22097. REPLACE INTO translators VALUES ('5e3e6245-83da-4f55-a39b-b712df54a935', '1.0.0b3.r1', '', '2008-05-19 17:20:00', '0', '90', '4', 'Melvyl', 'Sean Takats and Michael Berkowitz', '^https?://(?:melvyl.cdlib.org|melvyl-dev.cdlib.org:8162)/F(?:/[A-Z0-9\-]+(?:\?.*)?$|\?func=find|\?func=scan)', 
  22098. 'function detectWeb(doc, url) {
  22099.     var singleRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)");
  22100.     
  22101.     if(singleRe.test(doc.location.href)) {
  22102.         return "book";
  22103.     } else {
  22104.         var tags = doc.getElementsByTagName("a");
  22105.         for(var i=0; i<tags.length; i++) {
  22106.             if(singleRe.test(tags[i].href)) {
  22107.                 return "multiple";
  22108.             }
  22109.         }
  22110.     }
  22111. }', 
  22112. 'function doWeb(doc, url) {
  22113.     var detailRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)");
  22114.     var uri = doc.location.href;
  22115.     var newUris = new Array();
  22116.     
  22117.     if(detailRe.test(uri)) {
  22118.     newUris.push(uri.replace(/\&format=[0-9]{3}/, "&format=001"))
  22119.     } else {
  22120.         var itemRegexp = ''^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct)'';
  22121.         
  22122.         var namespace = doc.documentElement.namespaceURI;
  22123.         var nsResolver = namespace ? function(prefix) {
  22124.             if (prefix == ''x'') return namespace; else return null;
  22125.         } : null;
  22126.             
  22127.         var reviewXpath = ''//table/tbody/tr[td[@class="resultsDisplayWhite"]]''
  22128.         
  22129.         var reviewRows = doc.evaluate(reviewXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  22130.         var reviewRow;
  22131.         
  22132.         var items = new Array();
  22133.         
  22134.         if (reviewRow = reviewRows.iterateNext()){
  22135.             var xpath = ''./td[@class="resultsDisplayWhite"][2]/a[1]'';
  22136.             var titleXpath = ''./td[@class="resultsDisplayWhite"][5]'';
  22137.             var elmt;
  22138.             var titleElmt;
  22139.             do {
  22140.                 elmt = doc.evaluate(xpath, reviewRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22141.                 titleElmt = doc.evaluate(titleXpath, reviewRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22142.                 items[elmt.href] = Zotero.Utilities.cleanString(titleElmt.textContent);
  22143.             } while (reviewRow = reviewRows.iterateNext());
  22144.  
  22145.         } else {
  22146.             var xpath = ''//td[2][@class="resultsBrief"]/a[1]'';  // gets MELVYL links
  22147.             var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  22148.             var elmt;
  22149.             var titleXpath = ''//tr[td[@class="resultsBrief"][@id="bold"]/b[text()="Title"]]/td[4]''; // gets MELVYL results titles
  22150.             var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  22151.             var titleElmt;
  22152.             while ((elmt = elmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())){
  22153.                 items[elmt.href] = Zotero.Utilities.cleanString(titleElmt.textContent);
  22154.             }
  22155.         }
  22156.             
  22157.         items = Zotero.selectItems(items);
  22158.         
  22159.         if(!items) {
  22160.             return true;
  22161.         }
  22162.         
  22163.         for(var i in items) {
  22164.             var newUri = i.replace(/\&format=[0-9]{3}/, "&format=001")
  22165.             if(newUri == i) {
  22166.                 newUri += "&format=001";
  22167.             }
  22168.             newUris.push(newUri);
  22169.         }
  22170.     }
  22171.     
  22172.     var translator = Zotero.loadTranslator("import");
  22173.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22174.     var marc = translator.getTranslatorObject();
  22175.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  22176.         var uri = newDoc.location.href;
  22177.  
  22178.         var namespace = newDoc.documentElement.namespaceURI;
  22179.         var nsResolver = namespace ? function(prefix) {
  22180.           if (prefix == ''x'') return namespace; else return null;
  22181.         } : null;
  22182.         
  22183.         var xpath = ''//tr[td[1][@class="contentSmall"][@id="bold"]/strong]'';
  22184.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  22185.         var elmt;
  22186.         
  22187.         var record = new marc.record();
  22188.         while(elmt = elmts.iterateNext()) {
  22189.             var field = Zotero.Utilities.trimInternal(newDoc.evaluate(''./TD[1]/strong/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  22190.             var value = newDoc.evaluate(''./TD[2]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  22191.             
  22192.             if(field == "LDR") {
  22193.                 record.leader = value;
  22194.             } else if(field != "FMT") {
  22195.                 
  22196.                 value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  22197.                 
  22198.                 var code = field.substring(0, 3);
  22199.                 var ind = "";
  22200.                 if(field.length > 3) {
  22201.                     ind = field[3];
  22202.                     if(field.length > 4) {
  22203.                         ind += field[4];
  22204.                     }
  22205.                 }
  22206.                 record.addField(code, ind, value);
  22207.             }
  22208.         }
  22209.         
  22210.         var newItem = new Zotero.Item();
  22211.         record.translate(newItem);
  22212.         
  22213.         var domain = url.match(/https?:\/\/([^/]+)/);
  22214.         newItem.repository = domain[1]+" Library Catalog";
  22215.         
  22216.         newItem.complete();
  22217.     }, function() { Zotero.done(); }, null);
  22218.     
  22219.     Zotero.wait();
  22220. }');
  22221.  
  22222. REPLACE INTO translators VALUES ('cf87eca8-041d-b954-795a-2d86348999d5', '1.0.0b3.r1', '', '2008-06-10 22:30:00', '1', '100', '4', 'Library Catalog (Aleph)', 'Simon Kornblith and Michael Berkowitz', 'https?://[^/]+/F(?:/[A-Z0-9\-]+(?:\?.*)?$|\?func=find|\?func=scan|\?func=short)', 
  22223. 'function detectWeb(doc, url) {
  22224.     var singleRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct|func=myshelf-full.*)");
  22225.     
  22226.     if(singleRe.test(doc.location.href)) {
  22227.         return "book";
  22228.     } else {
  22229.         var tags = doc.getElementsByTagName("a");
  22230.         for(var i=0; i<tags.length; i++) {
  22231.             if(singleRe.test(tags[i].href)) {
  22232.                 return "multiple";
  22233.             }
  22234.         }
  22235.     }
  22236. }', 
  22237. 'function doWeb(doc, url) {
  22238.     var detailRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct|func=myshelf-full.*)");
  22239.     var mab2Opac = new RegExp("^https?://[^/]+berlin|193\.30\.112\.134|duisburg-essen/F/[A-Z0-9\-]+\?.*");
  22240.     var uri = doc.location.href;
  22241.     var newUris = new Array();
  22242.     
  22243.     if(detailRe.test(uri)) {
  22244.         var newuri = uri.replace(/\&format=[0-9]{3}/, "&format=001");
  22245.         if (newuri == uri) newuri += "&format=001";
  22246.         newUris.push(newuri);
  22247.     } else {
  22248.         var itemRegexp = ''^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct|func=myshelf-full.*)''
  22249.         var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp, ''^[0-9]+$'');
  22250.         
  22251.         // ugly hack to see if we have any items
  22252.         var haveItems = false;
  22253.         for(var i in items) {
  22254.             haveItems = true;
  22255.             break;
  22256.         }
  22257.         
  22258.         // If we don''t have any items otherwise, let us use the numbers
  22259.         if(!haveItems) {
  22260.             var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp);
  22261.         }
  22262.         
  22263.         items = Zotero.selectItems(items);
  22264.         
  22265.         if(!items) {
  22266.             return true;
  22267.         }
  22268.         
  22269.         for(var i in items) {
  22270.             var newUri = i.replace("&format=999", "&format=001");
  22271.             if(newUri == i) {
  22272.                 newUri += "&format=001";
  22273.             }
  22274.             newUris.push(newUri);
  22275.         }
  22276.     }
  22277.     var translator = Zotero.loadTranslator("import");
  22278.     if(mab2Opac.test(uri)) {
  22279.         translator.setTranslator("91acf493-0de7-4473-8b62-89fd141e6c74");
  22280.     } else {
  22281.         translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22282.     }    
  22283.     var marc = translator.getTranslatorObject();
  22284.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  22285.         var uri = newDoc.location.href;
  22286.         var namespace = newDoc.documentElement.namespaceURI;
  22287.         var nsResolver = namespace ? function(prefix) {
  22288.           if (prefix == ''x'') return namespace; else return null;
  22289.         } : null;
  22290.         var nonstandard = false;
  22291.         var xpath;
  22292.         if (newDoc.evaluate(''//*[tr[td/text()="LDR"]]/tr[td[2]]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  22293.             xpath = ''//*[tr[td/text()="LDR"]]/tr[td[2]]'';
  22294.         } else if (newDoc.evaluate(''//tr[2]//table[2]//tr'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  22295.             xpath = ''//tr[2]//table[2]//tr[td[2]]'';
  22296.             nonstandard = true;
  22297.         } else if (newDoc.evaluate(''//table//tr[td[2][@class="td1"]]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  22298.             xpath = ''//table//tr[td[2][@class="td1"]]'';
  22299.             nonstandard = true;
  22300.         } else if (newDoc.evaluate(''//tr/td[2]/table/tbody[tr/td[contains(text(), "LDR")]]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  22301.             xpath = ''//tr/td[2]/table/tbody[tr/td[contains(text(), "LDR")]]/tr'';
  22302.             nonstandard = true;
  22303.         }
  22304.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  22305.         var elmt;
  22306.         var record = new marc.record();
  22307.         while(elmt = elmts.iterateNext()) {
  22308.             if (nonstandard) {
  22309.                 var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./td[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  22310.             } else {
  22311.                 var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  22312.             }
  22313.             var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./td[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  22314.             if(field) {
  22315.                 var value = newDoc.evaluate(''./TD[2]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; //.split(/\n/)[1];
  22316.                 if (value.split(/\n/)[1]) value = Zotero.Utilities.trimInternal(value.split(/\n/)[1]);
  22317.                 Zotero.debug(field + " : " + value);
  22318.                 if(field == "LDR") {
  22319.                     record.leader = value;
  22320.                 } else if(field != "FMT") {
  22321.                     value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  22322.                 
  22323.                     var code = field.substring(0, 3);
  22324.                     var ind = "";
  22325.                     if(field.length > 3) {
  22326.                         ind = field[3];
  22327.                         if(field.length > 4) {
  22328.                             ind += field[4];
  22329.                         }
  22330.                     }
  22331.                 
  22332.                     record.addField(code, ind, value);
  22333.                 }
  22334.             }
  22335.         }
  22336.         var newItem = new Zotero.Item();
  22337.         record.translate(newItem);
  22338.         
  22339.         var domain = url.match(/https?:\/\/([^/]+)/);
  22340.         newItem.repository = domain[1]+" Library Catalog";
  22341.  
  22342.         for (var i in newItem.creators) {
  22343.             if (!newItem.creators[i][''firstName'']) {
  22344.                 var name = newItem.creators[i][''lastName''].split(/([^\s]+)\s+(.*)$/);
  22345.                 newItem.creators[i] = {lastName:name[1], firstName:name[2], creatorType:''author''};
  22346.             }
  22347.         }
  22348.         
  22349.         var oldCreators = newItem.creators;
  22350.         newItem.creators = new Array();
  22351.         var transient = new Array();
  22352.         for each (var a in oldCreators) {
  22353.             if (a.lastName) {
  22354.                 if (!a.lastName.match(/\d+/)) transient.push(a);
  22355.             }
  22356.         }
  22357.         for each (var a in transient) {
  22358.             if (a.firstName) {
  22359.                 if (a.firstName.match(/\|/)) a.firstName = a.firstName.match(/([^|]+)\s+|/)[1];
  22360.             }
  22361.         }
  22362.         newItem.creators = transient;
  22363.         newItem.title = newItem.title.replace(/(<<|>>)/g, '''');
  22364.         newItem.complete();
  22365.     }, function() {Zotero.done;});
  22366.     Zotero.wait();
  22367. }');
  22368.  
  22369.  
  22370. REPLACE INTO translators VALUES ('774d7dc2-3474-2684-392c-f787789ec63d', '1.0.0b3.r1', '', '2009-02-25 07:15:00', 1, 100, 4, 'Library Catalog (Dynix)', 'Simon Kornblith', 'ipac\.jsp\?.*(?:uri=(?:link|full)=[0-9]|menu=search)',
  22371. 'function detectWeb(doc, url) {
  22372.     var detailsRe = new RegExp(''ipac\.jsp\?.*uri=(?:full|link)=[0-9]'');
  22373.     if(detailsRe.test(doc.location.href)) {
  22374.         return "book";
  22375.     } else {
  22376.         return "multiple";
  22377.     }
  22378. }',
  22379. 'function doWeb(doc, url) {
  22380.     var namespace = doc.documentElement.namespaceURI;
  22381.     var nsResolver = namespace ? function(prefix) {
  22382.         if (prefix == ''x'') return namespace; else return null;
  22383.     } : null;
  22384.  
  22385.     var uri = doc.location.href;
  22386.     var detailsRe = new RegExp(''ipac\.jsp\?.*uri=(?:full|link)=[0-9]'');
  22387.     
  22388.     var uris = new Array();
  22389.     if(detailsRe.test(uri)) {
  22390.         uris.push(uri+''&fullmarc=true'');
  22391.     } else {
  22392.         var items = Zotero.Utilities.getItemArray(doc, doc, "ipac\.jsp\?.*uri=(?:full|link)=[0-9]|^javascript:buildNewList\\(''.*uri%3Dfull%3D[0-9]", "Show details");
  22393.         items = Zotero.selectItems(items);
  22394.         
  22395.         if(!items) {
  22396.             return true;
  22397.         }
  22398.         
  22399.         var buildNewList = new RegExp("^javascript:buildNewList\\(''([^'']+)");
  22400.         
  22401.         var uris = new Array();
  22402.         for(var i in items) {
  22403.             var m = buildNewList.exec(i);
  22404.             if(m) {
  22405.                 uris.push(unescape(m[1]+''&fullmarc=true''));
  22406.             } else {
  22407.                 uris.push(i+''&fullmarc=true'');
  22408.             }
  22409.         }
  22410.     }
  22411.     
  22412.     var translator = Zotero.loadTranslator("import");
  22413.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22414.     var marc = translator.getTranslatorObject();
  22415.     
  22416.     Zotero.Utilities.processDocuments(uris, function(newDoc) {
  22417.         var uri = newDoc.location.href;
  22418.         
  22419.         var namespace = newDoc.documentElement.namespaceURI;
  22420.         var nsResolver = namespace ? function(prefix) {
  22421.           if (prefix == ''x'') return namespace; else return null;
  22422.         } : null;
  22423.         
  22424.         var xpath = ''//form/table[@class="tableBackground"]/tbody/tr/td/table[@class="tableBackground"]/tbody/tr[td[1]/a[@class="normalBlackFont1"]]'';
  22425.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  22426.         if (!elmts.iterateNext()) {
  22427.             var xpath2 = ''//form/table[@class="tableBackground"]/tbody/tr/td/table[@class="tableBackground"]/tbody/tr[td[1]/a[@class="boldBlackFont1"]]'';
  22428.             var elmts = newDoc.evaluate(xpath2, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  22429.         }
  22430.         var elmt;
  22431.         
  22432.         var record = new marc.record();        
  22433.         while(elmt = elmts.iterateNext()) {
  22434.             var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./TD[1]/A[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  22435.             var value = newDoc.evaluate(''./TD[2]/TABLE[1]/TBODY[1]/TR[1]/TD[1]/A[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22436.             
  22437.             // value = null for non-marc table entries w/ that xpath
  22438.             if (!value) {
  22439.                 value = '''';
  22440.             } else {
  22441.                 value = value.textContent;
  22442.             }
  22443.             
  22444.             if(field == "LDR") {
  22445.                 record.leader = value;
  22446.             } else if(field != "FMT") {
  22447.                 value = value.replace(/\$([a-z]) /g, marc.subfieldDelimiter+"$1");
  22448.                 
  22449.                 var code = field.substring(0, 3);
  22450.                 var ind = "";
  22451.                 if(field.length > 3) {
  22452.                     ind = field[3];
  22453.                     if(field.length > 4) {
  22454.                         ind += field[4];
  22455.                     }
  22456.                 }
  22457.                 
  22458.                 record.addField(code, ind, value);
  22459.             }
  22460.         }
  22461.         
  22462.         var newItem = new Zotero.Item();
  22463.         record.translate(newItem);
  22464.         
  22465.         var domain = url.match(/https?:\/\/([^/]+)/);
  22466.         newItem.repository = domain[1]+" Library Catalog";
  22467.  
  22468.         newItem.complete();
  22469.     }, function() { Zotero.done() }, null);
  22470.     
  22471.     Zotero.wait();
  22472. }');
  22473.  
  22474.  
  22475. REPLACE INTO translators VALUES ('63a0a351-3131-18f4-21aa-f46b9ac51d87', '1.0.0b3.r1', '', '2008-08-11 20:40:00', '1', '100', '4', 'Library Catalog (VTLS)', 'Simon Kornblith', '/chameleon(?:\?|$)', 
  22476. 'function detectWeb(doc, url) {
  22477.     var node = doc.evaluate(''//tr[@class="intrRow"]/td/table/tbody/tr[th]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  22478.     if(node) {
  22479.         return "multiple";
  22480.     }
  22481.     var node = doc.evaluate(''//a[text()="marc"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  22482.     if(node) {
  22483.         return "book";
  22484.     }
  22485. }', 
  22486. 'function doWeb(doc, url) {
  22487.     var namespace = doc.documentElement.namespaceURI;
  22488.     var nsResolver = namespace ? function(prefix) {
  22489.         if (prefix == ''x'') return namespace; else return null;
  22490.     } : null;
  22491.     
  22492.     var uri = doc.location.href;
  22493.     var newUris = new Array();
  22494.     
  22495.     var marcs = doc.evaluate(''//a[text()="marc"]'', doc, nsResolver,
  22496.                              XPathResult.ANY_TYPE, null);
  22497.     var record = marcs.iterateNext();
  22498.     
  22499.     if(record && !marcs.iterateNext()) {
  22500.         newUris.push(record.href);
  22501.     } else {
  22502.         // Require link to match this
  22503.         var tagRegexp = new RegExp();
  22504.         tagRegexp.compile("/chameleon\?.*function=CARDSCR");
  22505.         
  22506.         var items = new Array();
  22507.         
  22508.         var tableRows = doc.evaluate(''//tr[@class="intrRow"]'', doc, nsResolver,
  22509.                                      XPathResult.ANY_TYPE, null);
  22510.         var tableRow;
  22511.         // Go through table rows
  22512.         while(tableRow = tableRows.iterateNext()) {
  22513.             var links = tableRow.getElementsByTagName("a");
  22514.             // Go through links
  22515.             var url;
  22516.             for(var j=0; j<links.length; j++) {
  22517.                 if(tagRegexp.test(links[j].href)) {
  22518.                     url = links[j].href;
  22519.                     break;
  22520.                 }
  22521.             }
  22522.             if(url) {
  22523.                 // Collect title information
  22524.                 var fields = doc.evaluate(''./td/table/tbody/tr[th]'', tableRow,
  22525.                                           nsResolver, XPathResult.ANY_TYPE, null);
  22526.                 var field;
  22527.                 while(field = fields.iterateNext()) {
  22528.                     var header = doc.evaluate(''./th/text()'', field, nsResolver,
  22529.                                               XPathResult.ANY_TYPE, null).iterateNext();
  22530.                     if(header.nodeValue == "Title") {
  22531.                         var value = doc.evaluate(''./td'', field, nsResolver,
  22532.                             XPathResult.ANY_TYPE, null).iterateNext();
  22533.                         if(value) {
  22534.                             items[url] = Zotero.Utilities.cleanString(value.textContent);
  22535.                         }
  22536.                     }
  22537.                 }
  22538.             }
  22539.         }
  22540.         
  22541.         items = Zotero.selectItems(items);
  22542.         
  22543.         if(!items) {
  22544.             return true;
  22545.         }
  22546.         
  22547.         for(var i in items) {
  22548.             Zotero.debug(i.replace(/function=[A-Z]{7}/, "function=MARCSCR"));
  22549.             newUris.push(i.replace(/function=[A-Z]{7}/, "function=MARCSCR"));
  22550.         }
  22551.     }
  22552.     
  22553.     var translator = Zotero.loadTranslator("import");
  22554.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22555.     var marc = translator.getTranslatorObject();
  22556.     
  22557.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  22558.         var uri = newDoc.location.href
  22559.         
  22560.         var namespace = newDoc.documentElement.namespaceURI;
  22561.         var nsResolver = namespace ? function(prefix) {
  22562.           if (prefix == ''x'') return namespace; else return null;
  22563.         } : null;
  22564.         
  22565.         var record = new marc.record();
  22566.         
  22567. //        var xpath = ''//table[@class="outertable"]/tbody/tr[td[4]]''; //old xpath
  22568. //        xpaths from virginia college of osteopathic medicine
  22569. //        /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[1][@class="marcTag"]
  22570. //        /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[2]
  22571. //        /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[3]
  22572. //        /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[4][@class="marcSubfields"]
  22573.         var xpath = ''//table[@class="marctable"]/tbody/tr[td[4]]'';
  22574.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
  22575.                                     XPathResult.ANY_TYPE, null);
  22576.         
  22577.         while(elmt = elmts.iterateNext()) {
  22578.             var field = newDoc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  22579.             var ind1 = newDoc.evaluate(''./TD[2]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  22580.             var ind2 = newDoc.evaluate(''./TD[3]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  22581.             var value = newDoc.evaluate(''./TD[4]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  22582.             value = value.replace(/\\([a-z]) /g, marc.subfieldDelimiter+"$1");
  22583.             
  22584.             record.addField(field, ind1+ind2, value);
  22585.         }
  22586.         
  22587.         var newItem = new Zotero.Item();
  22588.         record.translate(newItem);
  22589.         
  22590.         var domain = url.match(/https?:\/\/([^/]+)/);
  22591.         newItem.repository = domain[1]+" Library Catalog";
  22592.         
  22593.         newItem.complete();
  22594.     }, function(){ Zotero.done(); }, null);
  22595.     
  22596.     Zotero.wait();
  22597. }');
  22598.  
  22599.  
  22600. REPLACE INTO translators VALUES ('fb12ae9e-f473-cab4-0546-27ab88c64101', '1.0.0b3.r1', '', '2009-01-12 18:25:00', 1, 100, 4, 'Library Catalog (DRA)', 'Simon Kornblith', '/web2/tramp2\.exe/(?:see\_record/|authority\_hits/|goto/.*\?.*screen=Record\.html)',
  22601. 'function detectWeb(doc, url) {
  22602.     if(doc.location.href.indexOf("/authority_hits") > 0) {
  22603.         return "multiple";
  22604.     } else {
  22605.         return "book";
  22606.     }
  22607. }',
  22608. 'function doWeb(doc, url) {
  22609.     var checkItems = false;
  22610.     
  22611.     if(doc.location.href.indexOf("/authority_hits") > 0) {
  22612.         var namespace = doc.documentElement.namespaceURI;
  22613.         var nsResolver = namespace ? function(prefix) {
  22614.             if (prefix == ''x'') return namespace; else return null;
  22615.         } : null;
  22616.         
  22617.         checkItems = Zotero.Utilities.gatherElementsOnXPath(doc, doc, "/html/body//ol/li", nsResolver);
  22618.     }
  22619.     
  22620.     if(checkItems && checkItems.length) {
  22621.         var items = Zotero.Utilities.getItemArray(doc, checkItems, ''https?://.*/web2/tramp2\.exe/see_record'');
  22622.         items = Zotero.selectItems(items);
  22623.         
  22624.         if(!items) {
  22625.             return true;
  22626.         }
  22627.         
  22628.         var uris = [];
  22629.         for(var i in items) {
  22630.             uris.push(i);
  22631.         }
  22632.     } else {
  22633.         var uris = [doc.location.href];
  22634.     }
  22635.     
  22636.     for(var i in uris) {
  22637.         var uri = uris[i];
  22638.         var uriRegexp = /^(https?:\/\/.*\/web2\/tramp2\.exe\/)(?:goto|see\_record|authority\_hits)(\/.*)\?(?:screen=Record\.html\&)?(.*)$/i;
  22639.         var m = uriRegexp.exec(uri);
  22640.         if(uri.indexOf("/authority_hits") < 0) {
  22641.             var newUri = m[1]+"download_record"+m[2]+"/RECORD.MRC?format=marc&"+m[3];
  22642.         } else {
  22643.             var newUri = m[1]+"download_record"+m[2]+"/RECORD.MRC?format=marc";
  22644.         }
  22645.         
  22646.         // Keep track of how many requests have been completed
  22647.         var j = 0;
  22648.         
  22649.         var translator = Zotero.loadTranslator("import");
  22650.         translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22651.         
  22652.         var domain = url.match(/https?:\/\/([^/]+)/);
  22653.         translator.setHandler("itemDone", function(obj, item) {
  22654.             item.repository = domain[1]+" Library Catalog";
  22655.             item.complete();
  22656.         });
  22657.         
  22658.         Zotero.Utilities.HTTP.doGet(newUri, function(text) {
  22659.             translator.setString(text);
  22660.             translator.translate();
  22661.             
  22662.             j++;
  22663.             if(j == uris.length) {
  22664.                 Zotero.done();
  22665.             }
  22666.         });
  22667.     }
  22668.     Zotero.wait();
  22669. }');
  22670.  
  22671.  
  22672. REPLACE INTO translators VALUES ('c0e6fda6-0ecd-e4f4-39ca-37a4de436e15', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (GEAC)', 'Simon Kornblith', '/(?:GeacQUERY|GeacFETCH[\:\?].*[&:]next=html/(?:record\.html|geacnffull\.html))',
  22673. 'function detectWeb(doc, url) {
  22674.     if(doc.location.href.indexOf("/GeacQUERY") > 0) {
  22675.         return "multiple";
  22676.     } else {
  22677.         return "book";
  22678.     }
  22679. }',
  22680. 'function doWeb(doc, url) {
  22681.     var uri = doc.location.href;
  22682.     
  22683.     var uris = new Array();
  22684.     
  22685.     if(uri.indexOf("/GeacQUERY") > 0) {
  22686.         var items = Zotero.Utilities.getItemArray(doc, doc, "(?:Geac)?FETCH[\:\?].*[&:]next=html/(?:record\.html|geacnffull\.html)");
  22687.         items = Zotero.selectItems(items);
  22688.         
  22689.         if(!items) {
  22690.             return true;
  22691.         }
  22692.         
  22693.         var uris = new Array();
  22694.         for(var i in items) {
  22695.             var newUri = i.replace(/([:&])next=html\/geacnffull.html/, "$1next=html/marc.html");
  22696.             newUri = newUri.replace(/([:&])next=html\/record.html/, "$1next=html/marc.html");
  22697.             uris.push(newUri);
  22698.         }
  22699.     } else {
  22700.         var newUri = uri.replace(/([:&])next=html\/geacnffull.html/, "$1next=html/marc.html");
  22701.         newUri = newUri.replace(/([:&])next=html\/record.html/, "$1next=html/marc.html");
  22702.         uris.push(newUri);
  22703.     }
  22704.     
  22705.     var translator = Zotero.loadTranslator("import");
  22706.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22707.     var marc = translator.getTranslatorObject();
  22708.     
  22709.     Zotero.Utilities.processDocuments(uris, function(newDoc) {
  22710.         var uri = newDoc.location.href;
  22711.         
  22712.         var namespace = newDoc.documentElement.namespaceURI;
  22713.         var nsResolver = namespace ? function(prefix) {
  22714.           if (prefix == ''x'') return namespace; else return null;
  22715.         } : null;
  22716.         
  22717.         var record = new marc.record();
  22718.         
  22719.         var elmts = newDoc.evaluate(''//pre/text()'', newDoc, nsResolver,
  22720.                                     XPathResult.ANY_TYPE, null);
  22721.         var elmt, tag, content;
  22722.         var ind = "";
  22723.         
  22724.         while(elmt = elmts.iterateNext()) {
  22725.             var line = elmt.nodeValue;
  22726.             
  22727.             if(line.substring(0, 6) == "       ") {
  22728.                 content += " "+line.substring(6);
  22729.                 continue;
  22730.             } else {
  22731.                 if(tag) {
  22732.                     record.addField(tag, ind, content);
  22733.                 }
  22734.             }
  22735.             
  22736.             line = line.replace(/[_\t\xA0]/g," "); // nbsp
  22737.             
  22738.             tag = line.substr(0, 3);
  22739.             if(tag[0] != "0" || tag[1] != "0") {
  22740.                 ind = line.substr(4, 2);
  22741.                 content = line.substr(7).replace(/\$([a-z])(?: |$)/g, marc.subfieldDelimiter+"$1");
  22742.             } else {
  22743.                 if(tag == "000") {
  22744.                     tag = undefined;
  22745.                     record.leader = "00000"+line.substr(4);
  22746.                 } else {
  22747.                     content = line.substr(4);
  22748.                 }
  22749.             }
  22750.             
  22751.         }
  22752.         
  22753.         var newItem = new Zotero.Item();
  22754.         record.translate(newItem);
  22755.         
  22756.         var domain = url.match(/https?:\/\/([^/]+)/);
  22757.         newItem.repository = domain[1]+" Library Catalog";
  22758.         
  22759.         newItem.complete();
  22760.     }, function() { Zotero.done(); }, null);
  22761.     
  22762.     Zotero.wait();
  22763. }');
  22764.  
  22765. REPLACE INTO translators VALUES ('0f9fc2fc-306e-5204-1117-25bca009dffc', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (TLC/YouSeeMore)', 'Simon Kornblith', 'TLCScripts/interpac\.dll\?(?:.*LabelDisplay.*RecordNumber=[0-9]|Search|ItemTitles)',
  22766. 'function detectWeb(doc, url) {
  22767.     var detailRe = new RegExp("TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]");
  22768.     if(detailRe.test(doc.location.href)) {
  22769.         return "book";
  22770.     } else {
  22771.         return "multiple";
  22772.     }
  22773. }',
  22774. 'function doWeb(doc, url) {
  22775.     var namespace = doc.documentElement.namespaceURI;
  22776.     var nsResolver = namespace ? function(prefix) {
  22777.         if (prefix == ''x'') return namespace; else return null;
  22778.     } : null;
  22779.     
  22780.     var detailRe = new RegExp("TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]");
  22781.     var uri = doc.location.href;
  22782.     var newUris = new Array();
  22783.     
  22784.     if(detailRe.test(uri)) {
  22785.         newUris.push(uri.replace("LabelDisplay", "MARCDisplay"));
  22786.     } else {
  22787.         var items = Zotero.Utilities.getItemArray(doc, doc, ''TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]'');
  22788.         items = Zotero.selectItems(items);
  22789.         
  22790.         if(!items) {
  22791.             return true;
  22792.         }
  22793.         
  22794.         for(var i in items) {
  22795.             newUris.push(i.replace("LabelDisplay", "MARCDisplay"));
  22796.         }
  22797.     }
  22798.     
  22799.     var translator = Zotero.loadTranslator("import");
  22800.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  22801.     var marc = translator.getTranslatorObject();
  22802.     
  22803.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  22804.         var uri = newDoc.location.href;
  22805.         
  22806.         var namespace = newDoc.documentElement.namespaceURI;
  22807.         var nsResolver = namespace ? function(prefix) {
  22808.           if (prefix == ''x'') return namespace; else return null;
  22809.         } : null;
  22810.         
  22811.         var record = new marc.record();
  22812.         
  22813.         var elmts = newDoc.evaluate(''/html/body/table/tbody/tr[td[4]]'', newDoc, nsResolver,
  22814.                                     XPathResult.ANY_TYPE, null);
  22815.         var tag, ind, content, elmt;
  22816.         
  22817.         while(elmt = elmts.iterateNext()) {
  22818.             tag = newDoc.evaluate(''./td[2]/tt[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  22819.             var inds = newDoc.evaluate(''./td[3]/tt[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  22820.             
  22821.             tag = tag.replace(/[\r\n]/g, "");
  22822.             inds = inds.replace(/[\r\n\xA0]/g, "");
  22823.             
  22824.             var children = newDoc.evaluate(''./td[4]/tt[1]//text()'', elmt, nsResolver,
  22825.                                            XPathResult.ANY_TYPE, null);
  22826.             var subfield = children.iterateNext();
  22827.             var fieldContent = children.iterateNext();
  22828.             
  22829.             if(tag == "LDR") {
  22830.                 record.leader = "00000"+subfield.nodeValue;
  22831.             } else {
  22832.                 content = "";
  22833.                 if(!fieldContent) {
  22834.                     content = subfield.nodeValue;
  22835.                 } else {
  22836.                     while(subfield && fieldContent) {
  22837.                         content += marc.subfieldDelimiter+subfield.nodeValue.substr(1, 1)+fieldContent.nodeValue;
  22838.                         var subfield = children.iterateNext();
  22839.                         var fieldContent = children.iterateNext();
  22840.                     }
  22841.                 }
  22842.                 
  22843.                 record.addField(tag, inds, content);
  22844.             }
  22845.         }
  22846.         
  22847.         var newItem = new Zotero.Item();
  22848.         record.translate(newItem);
  22849.         
  22850.         var domain = url.match(/https?:\/\/([^/]+)/);
  22851.         newItem.repository = domain[1]+" Library Catalog";
  22852.         
  22853.         newItem.complete();
  22854.     }, function() {Zotero.done(); }, null);
  22855.     
  22856.     Zotero.wait();
  22857. }');
  22858.  
  22859.  
  22860. REPLACE INTO translators VALUES ('c54d1932-73ce-dfd4-a943-109380e06574', '1.0.0b4.r1', '', '2008-12-22 19:50:00', 1, 100, 4, 'Project MUSE', 'Simon Kornblith', 'https?://[^/]*muse\.jhu\.edu[^/]*/(?:journals/[^/]+/[^/]+/[^/]+\.html|search/results)',
  22861. 'function detectWeb(doc, url) {
  22862.     var searchRe = new RegExp("^https?://[^/]+/search/results");
  22863.     if(searchRe.test(url)) {
  22864.         return "multiple";
  22865.     } else {
  22866.         return "journalArticle";
  22867.     }
  22868. }', 
  22869. 'function doWeb(doc, url) {
  22870.     var namespace = doc.documentElement.namespaceURI;
  22871.     var nsResolver = namespace ? function(prefix) {
  22872.         if (prefix == ''x'') return namespace; else return null;
  22873.     } : null;
  22874.     
  22875.     var searchRe = new RegExp("^https?://[^/]+/search/results");
  22876.     if(detectWeb(doc, url) == "multiple") {
  22877.         var items = new Array();
  22878.         var attachments = new Array();
  22879.         var pdfRe = /PDF/;
  22880.         var htmlRe = /HTML/;
  22881.         
  22882.         var tableRows = doc.evaluate(''//div[@id="advancedsearch"]/save_form/table//tr'',
  22883.                                      doc, nsResolver, XPathResult.ANY_TYPE, null);
  22884.         var tableRow;
  22885.         // Go through table rows
  22886.         while(tableRow = tableRows.iterateNext()) {
  22887.             // aid (article id) is what we need to get it all as one file
  22888.             var input = doc.evaluate(''.//input[@name="aid"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22889.             var title = doc.evaluate(''.//div[@class="title"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  22890.             if(input && input.value && title && title.textContent) {
  22891.                 items[input.value] = title.textContent;
  22892.                 
  22893.                 var aTags = tableRow.getElementsByTagName("a");
  22894.                 
  22895.                 // get attachments
  22896.                 attachments[input.value] = new Array();
  22897.                 for(var i=0; i<aTags.length; i++) {
  22898.                     var linkText = aTags[i].textContent;
  22899.                     if(pdfRe.test(linkText)) {
  22900.                         attachments[input.value].push({url:aTags[i].href,
  22901.                                                       title:"Project MUSE Full Text PDF",
  22902.                                                       mimeType:"application/pdf"});
  22903.                     } else if(htmlRe.test(linkText)) {
  22904.                         attachments[input.value].push({url:aTags[i].href,
  22905.                                                       title:"Project MUSE Snapshot",
  22906.                                                       mimeType:"text/html"});
  22907.                     }
  22908.                 }
  22909.             }
  22910.         }
  22911.         items = Zotero.selectItems(items);
  22912.         if(!items) {
  22913.             return true;
  22914.         }
  22915.         
  22916.         var articleString = "";
  22917.         var newAttachments = new Array();
  22918.         for(var i in items) {
  22919.             articleString += "&aid="+i;
  22920.             newAttachments.push(attachments[i]);
  22921.         }
  22922.         
  22923.         Zotero.Utilities.HTTP.doGet("http://muse.jhu.edu/search/export.cgi?exporttype=endnote"+articleString, function(text) {
  22924.             // load translator for RIS
  22925.             var translator = Zotero.loadTranslator("import");
  22926.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  22927.             translator.setString(text);
  22928.             translator.setHandler("itemDone", function(obj, item) {
  22929.                 if(item.notes && item.notes[0]) {
  22930.                     item.extra = item.notes[0].note;                        
  22931.                     delete item.notes;
  22932.                     item.notes = undefined;
  22933.                 }
  22934.                 item.attachments = newAttachments.shift();
  22935.                 item.complete();
  22936.             });
  22937.             translator.translate();
  22938.             Zotero.done();
  22939.         }, function() {});
  22940.         
  22941.         Zotero.wait();
  22942.     } else {
  22943.         var hostRe = new RegExp("^(http://[^/]+)/");
  22944.         var m = hostRe.exec(url);
  22945.         var host = m[1];
  22946.  
  22947.         var getPDF = doc.evaluate(''//a[text() = "PDF Version"]'', doc,
  22948.                                   nsResolver, XPathResult.ANY_TYPE, null).iterateNext();        
  22949.         
  22950.         var newUrl = url.replace(host, host+"/metadata/zotero");
  22951.         Zotero.Utilities.HTTP.doGet(newUrl, function(text) {
  22952.             var translator = Zotero.loadTranslator("import");
  22953.             //set RIS translator
  22954.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  22955.             translator.setString(text);
  22956.             translator.setHandler("itemDone", function(obj, item) {
  22957.                 if(item.notes && item.notes[0]) {
  22958.                     item.extra = item.notes[0].note;                        
  22959.                     delete item.notes;
  22960.                     item.notes = undefined;
  22961.                 }
  22962.                 item.attachments.splice(0);
  22963.                 item.attachments.push({document:doc, title:"Project MUSE Snapshot"});
  22964.                 if(getPDF) {
  22965.                     item.attachments.push({title:"Project MUSE Full Text PDF", mimeType:"application/pdf",
  22966.                     url:getPDF.href});
  22967.                 }
  22968.                 
  22969.                 item.complete();
  22970.             });
  22971.             translator.translate();
  22972.         });
  22973.     }
  22974. }');
  22975.  
  22976.  
  22977. REPLACE INTO translators VALUES ('fcf41bed-0cbc-3704-85c7-8062a0068a7a', '1.0.0b3.r1', '', '2009-04-28 09:15:00', 1, 100, 12, 'NCBI PubMed', 'Simon Kornblith and Michael Berkowitz', 'http://[^/]*www\.ncbi\.nlm\.nih\.gov[^/]*/(pubmed|sites/entrez|entrez/query\.fcgi\?.*db=PubMed)',
  22978. 'function detectWeb(doc, url) {
  22979.     var namespace = doc.documentElement.namespaceURI;
  22980.     var nsResolver = namespace ? function(prefix) {
  22981.         if (prefix == ''x'') return namespace; else return null;
  22982.     } : null;
  22983.  
  22984.     var uids = doc.evaluate(''//input[@type="checkbox" or @name="uid"]'', doc,
  22985.                    nsResolver, XPathResult.ANY_TYPE, null);
  22986.     if(uids.iterateNext() && doc.title.indexOf("PMC Results") == -1) {
  22987.         if (uids.iterateNext() && doc.title.indexOf("PMC Results") == -1){
  22988.             return "multiple";
  22989.         }
  22990.         return "journalArticle";
  22991.     }
  22992. }
  22993. function getPMID(co) {
  22994.     var coParts = co.split("&");
  22995.     for each(part in coParts) {
  22996.         if(part.substr(0, 7) == "rft_id=") {
  22997.             var value = unescape(part.substr(7));
  22998.             if(value.substr(0, 10) == "info:pmid/") {
  22999.                 return value.substr(10);
  23000.             }
  23001.         }
  23002.     }
  23003. }
  23004.  
  23005. function detectSearch(item) {
  23006.     if(item.contextObject) {
  23007.         if(getPMID(item.contextObject)) {
  23008.             return "journalArticle";
  23009.         }
  23010.     }
  23011.     return false;
  23012. }',
  23013. 'function lookupPMIDs(ids, doc) {
  23014.     Zotero.wait();
  23015.     var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&retmode=xml&rettype=citation&id="+ids.join(",");
  23016.     Zotero.Utilities.HTTP.doGet(newUri, function(text) {
  23017.         // Remove xml parse instruction and doctype
  23018.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  23019.  
  23020.         var xml = new XML(text);
  23021.  
  23022.         for(var i=0; i<xml.PubmedArticle.length(); i++) {
  23023.             var newItem = new Zotero.Item("journalArticle");
  23024.  
  23025.             var citation = xml.PubmedArticle[i].MedlineCitation;
  23026.  
  23027.             var PMID = citation.PMID.text().toString();
  23028.             newItem.url = "http://www.ncbi.nlm.nih.gov/pubmed/" + PMID;
  23029.             newItem.extra = "PMID: "+PMID;
  23030.             // add attachments
  23031.             if(doc) {
  23032.                 newItem.attachments.push({document:doc, title:"PubMed Snapshot"});
  23033.             } else {
  23034.                 var url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids="+PMID;
  23035.                 newItem.attachments.push({url:url, title:"PubMed Snapshot",
  23036.                              mimeType:"text/html"});
  23037.             }
  23038.  
  23039.             var article = citation.Article;
  23040.             if(article.ArticleTitle.length()) {
  23041.                 var title = article.ArticleTitle.text().toString();
  23042.                 if(title.substr(-1) == ".") {
  23043.                     title = title.substring(0, title.length-1);
  23044.                 }
  23045.                 newItem.title = title;
  23046.             }
  23047.  
  23048.             if (article.Pagination.MedlinePgn.length()){
  23049.                 var fullPageRange = article.Pagination.MedlinePgn.text().toString();
  23050.                 var pageRange = fullPageRange.match(/\d+-\d+/g);
  23051.                 for (var j in pageRange) {
  23052.                     var pageRangeStart = pageRange[j].match(/^\d+/)[0];
  23053.                     var pageRangeEnd = pageRange[j].match(/\d+$/)[0];
  23054.                     if (pageRangeStart.length > pageRangeEnd.length) {
  23055.                         pageRangeEnd = pageRangeStart.substring(0,pageRangeStart.length-pageRangeEnd.length) + pageRangeEnd;
  23056.                         fullPageRange = fullPageRange.replace(pageRange[j],pageRangeStart+"-"+pageRangeEnd);
  23057.                     }
  23058.                 }
  23059.                 newItem.pages = fullPageRange;
  23060.             }
  23061.  
  23062.             if(article.Journal.length()) {
  23063.                 var issn = article.Journal.ISSN.text().toString();
  23064.                 if(issn) {
  23065.                     newItem.ISSN = issn;
  23066.                 }
  23067.                 
  23068.                 if(citation.Article.Journal.ISOAbbreviation.length()) {
  23069.                     newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.Article.Journal.ISOAbbreviation.text().toString());                
  23070.                 } else if(citation.MedlineJournalInfo.MedlineTA.length()) {
  23071.                     newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString());
  23072.                 }
  23073.  
  23074.                 if(article.Journal.Title.length()) {
  23075.                     newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString());
  23076.                 } else if(newItem.journalAbbreviation.length()) {
  23077.                     newItem.publicationTitle = newItem.journalAbbreviation;
  23078.                 }
  23079.  
  23080.                 if(article.Journal.JournalIssue.length()) {
  23081.                     newItem.volume = article.Journal.JournalIssue.Volume.text().toString();
  23082.                     newItem.issue = article.Journal.JournalIssue.Issue.text().toString();
  23083.                     if(article.Journal.JournalIssue.PubDate.length()) {    // try to get the date
  23084.                         if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") {
  23085.                             newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString();
  23086.                         } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") {
  23087.                             newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString();
  23088.                         } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") {
  23089.                             newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString();
  23090.                         } else if(article.Journal.JournalIssue.PubDate.MedlineDate.text().toString() != "") {
  23091.                             newItem.date = article.Journal.JournalIssue.PubDate.MedlineDate.text().toString();
  23092.                         }
  23093.                     }
  23094.                 }
  23095.             }
  23096.  
  23097.             if(article.AuthorList.length() && article.AuthorList.Author.length()) {
  23098.                 var authors = article.AuthorList.Author;
  23099.                 for(var j=0; j<authors.length(); j++) {
  23100.                     var lastName = authors[j].LastName.text().toString();
  23101.                     var firstName = authors[j].FirstName.text().toString();
  23102.                     if(firstName == "") {
  23103.                         var firstName = authors[j].ForeName.text().toString();
  23104.                     }
  23105.                     if(firstName || lastName) {
  23106.                         newItem.creators.push({lastName:lastName, firstName:firstName});
  23107.                     }
  23108.                 }
  23109.             }
  23110.             
  23111.             
  23112.             if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) {
  23113.                 var keywords = citation.MeshHeadingList.MeshHeading;
  23114.                 for (var k = 0 ; k < keywords.length() ; k++) {
  23115.                     newItem.tags.push(keywords[k].DescriptorName.text().toString());
  23116.                 }
  23117.             }
  23118.             newItem.abstractNote = article.Abstract.AbstractText.toString()
  23119.             
  23120.             newItem.DOI = xml.PubmedArticle[i].PubmedData.ArticleIdList.ArticleId.(@IdType == "doi" ).text().toString();
  23121.             newItem.publicationTitle = Zotero.Utilities.capitalizeTitle(newItem.publicationTitle);
  23122.             newItem.complete();
  23123.         }
  23124.  
  23125.         Zotero.done();
  23126.     });
  23127. }
  23128.  
  23129. function doWeb(doc, url) {
  23130.     var namespace = doc.documentElement.namespaceURI;
  23131.     var nsResolver = namespace ? function(prefix) {
  23132.         if (prefix == ''x'') return namespace; else return null;
  23133.         } : null;
  23134.     var ids = new Array();
  23135.     var uids = doc.evaluate(''//input[@type="checkbox" or @name="uid"]'', doc, //edited for new PubMed
  23136.                    nsResolver, XPathResult.ANY_TYPE, null);
  23137.     var uid = uids.iterateNext();
  23138.     if(uid) {
  23139.         if (uids.iterateNext()){
  23140.             var items = new Array();
  23141.             var tablex = ''//div[@class="rprt"]'';
  23142.             if (!doc.evaluate(tablex, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  23143.                 var tablex = ''//div[@class="ResultSet"]/dl'';
  23144.                 var other = true;
  23145.             }
  23146.             var tableRows = doc.evaluate(tablex, doc, nsResolver, XPathResult.ANY_TYPE, null);
  23147.             var tableRow;
  23148.             // Go through table rows
  23149.             while(tableRow = tableRows.iterateNext()) {
  23150.                 uid = doc.evaluate(''.//input[@type="checkbox"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23151.                 if (other) {
  23152.                     var article = doc.evaluate(''.//h2'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23153.                 } else {
  23154.                     var article = doc.evaluate(''.//p[@class="title"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23155.                 }
  23156.                 items[uid.value] = article.textContent;
  23157.             }
  23158.  
  23159.             items = Zotero.selectItems(items);
  23160.  
  23161.             if(!items) {
  23162.                 return true;
  23163.             }
  23164.  
  23165.             for(var i in items) {
  23166.                 ids.push(i);
  23167.             }
  23168.  
  23169.             lookupPMIDs(ids);
  23170.         } else {
  23171.             ids.push(uid.value);
  23172.             lookupPMIDs(ids, doc);
  23173.         }
  23174.     }
  23175. }
  23176.  
  23177. function doSearch(item) {
  23178.     // pmid was defined earlier in detectSearch
  23179.     lookupPMIDs([getPMID(item.contextObject)]);
  23180. }');
  23181.  
  23182.  
  23183. REPLACE INTO translators VALUES ('951c027d-74ac-47d4-a107-9c3069ab7b48', '1.0.0b3.r1', '', '2008-03-14 18:00:00', '1', '400', '4', 'Embedded RDF', 'Simon Kornblith', '', 
  23184. 'function detectWeb(doc, url) {
  23185.     if (url.indexOf("reprint") != -1) return false;
  23186.     var metaTags = doc.getElementsByTagName("meta");
  23187.     for(var i=0; i<metaTags.length; i++) {
  23188.         var tag = metaTags[i].getAttribute("name");
  23189.         if(tag && tag.substr(0, 3).toLowerCase() == "dc.") {
  23190.             return "webpage";
  23191.         }
  23192.     }
  23193.     
  23194.     return false;
  23195. }', 
  23196. 'function doWeb(doc, url) {
  23197.     var dc = "http://purl.org/dc/elements/1.1/";
  23198.  
  23199.     // load RDF translator, so that we don''t need to replicate import code
  23200.     var translator = Zotero.loadTranslator("import");
  23201.     translator.setTranslator("5e3ad958-ac79-463d-812b-a86a9235c28f");
  23202.     translator.setHandler("itemDone", function(obj, newItem) {
  23203.         // use document title if none given in dublin core
  23204.         if(!newItem.title) {
  23205.             newItem.title = doc.title;
  23206.         }
  23207.         // add attachment
  23208.         newItem.attachments.push({document:doc});
  23209.         // add url
  23210.         newItem.url = doc.location.href;
  23211.         newItem.repository = false;
  23212.         newItem.complete();
  23213.     });
  23214.     var rdf = translator.getTranslatorObject();
  23215.     
  23216.     var metaTags = doc.getElementsByTagName("meta");
  23217.     var foundTitle = false;        // We can use the page title if necessary
  23218.     for(var i=0; i<metaTags.length; i++) {
  23219.         var tag = metaTags[i].getAttribute("name");
  23220.         var value = metaTags[i].getAttribute("content");
  23221.         if(tag && value && tag.substr(0, 3).toLowerCase() == "dc.") {
  23222.             if(tag == "dc.title") {
  23223.                 foundTitle = true;
  23224.             }
  23225.             rdf.Zotero.RDF.addStatement(url, dc + tag.substr(3).toLowerCase(), value, true);
  23226.         } else if(tag && value && (tag == "author" || tag == "author-personal")) {
  23227.             rdf.Zotero.RDF.addStatement(url, dc + "creator", value, true);
  23228.         } else if(tag && value && tag == "author-corporate") {
  23229.             rdf.Zotero.RDF.addStatement(url, dc + "creator", value, true);
  23230.         }
  23231.     }
  23232.     
  23233.     rdf.defaultUnknownType = "webpage";
  23234.     rdf.doImport();
  23235. }');
  23236.  
  23237. REPLACE INTO translators VALUES ('05d07af9-105a-4572-99f6-a8e231c0daef', '1.0.0b3.r1', '', '2007-09-15 20:08:46', 1, 300, 4, 'COinS', 'Simon Kornblith', NULL,
  23238. 'function detectWeb(doc, url) {
  23239.     var spanTags = doc.getElementsByTagName("span");
  23240.     
  23241.     var encounteredType = false;
  23242.     
  23243.     for(var i=0; i<spanTags.length; i++) {
  23244.         var spanClass = spanTags[i].getAttribute("class");
  23245.         if(spanClass) {
  23246.             var spanClasses = spanClass.split(" ");
  23247.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  23248.                 var spanTitle = spanTags[i].getAttribute("title");
  23249.                 
  23250.                 // determine if it''s a valid type
  23251.                 var item = new Zotero.Item;
  23252.                 var success = Zotero.Utilities.parseContextObject(spanTitle, item);
  23253.                 
  23254.                 if(item.itemType) {
  23255.                     if(encounteredType) {
  23256.                         return "multiple";
  23257.                     } else {
  23258.                         encounteredType = item.itemType;
  23259.                     }
  23260.                 }
  23261.             }
  23262.         }
  23263.     }
  23264.     
  23265.     return encounteredType;
  23266. }',
  23267. '// used to retrieve next COinS object when asynchronously parsing COinS objects
  23268. // on a page
  23269. function retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc) {
  23270.     if(needFullItems.length) {
  23271.         var item = needFullItems.shift();
  23272.         
  23273.         Zotero.debug("looking up contextObject");
  23274.         var search = Zotero.loadTranslator("search");
  23275.         search.setHandler("itemDone", function(obj, item) {
  23276.             newItems.push(item);
  23277.         });
  23278.         search.setHandler("done", function() {
  23279.             retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc);
  23280.         });
  23281.         search.setSearch(item);
  23282.         
  23283.         // look for translators
  23284.         var translators = search.getTranslators();
  23285.         if(translators.length) {
  23286.             search.setTranslator(translators);
  23287.             search.translate();
  23288.         } else {
  23289.             retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc);
  23290.         }
  23291.     } else {
  23292.         completeCOinS(newItems, couldUseFullItems, doc);
  23293.         Zotero.done();
  23294.     }
  23295. }
  23296.  
  23297. // saves all COinS objects
  23298. function completeCOinS(newItems, couldUseFullItems, doc) {
  23299.     if(newItems.length > 1) {
  23300.         var selectArray = new Array();
  23301.         
  23302.         for(var i in newItems) {
  23303.             selectArray[i] = newItems[i].title;
  23304.         }
  23305.         selectArray = Zotero.selectItems(selectArray);
  23306.         
  23307.         var useIndices = new Array();
  23308.         for(var i in selectArray) {
  23309.             useIndices.push(i);
  23310.         }
  23311.         completeItems(newItems, useIndices, couldUseFullItems);
  23312.     } else if(newItems.length) {
  23313.         completeItems(newItems, [0], couldUseFullItems);
  23314.     }
  23315. }
  23316.  
  23317. function completeItems(newItems, useIndices, couldUseFullItems, doc) {
  23318.     if(!useIndices.length) {
  23319.         return;
  23320.     }
  23321.     var i = useIndices.shift();
  23322.     
  23323.     // grab full item if the COinS was missing an author
  23324.     if(couldUseFullItems[i]) {
  23325.         Zotero.debug("looking up contextObject");
  23326.         var search = Zotero.loadTranslator("search");
  23327.         
  23328.         var firstItem = false;
  23329.         search.setHandler("itemDone", function(obj, newItem) {
  23330.             if(!firstItem) {
  23331.                 // add doc as attachment
  23332.                 newItem.attachments.push({document:doc});
  23333.                 newItem.complete();
  23334.                 firstItem = true;
  23335.             }
  23336.         });
  23337.         search.setHandler("done", function(obj) {
  23338.             // if we didn''t find anything, use what we had before (even if it
  23339.             // lacks the creator)
  23340.             if(!firstItem) {
  23341.                 newItems[i].complete();
  23342.             }
  23343.             // call next
  23344.             completeItems(newItems, useIndices, couldUseFullItems);
  23345.         });
  23346.         
  23347.         search.setSearch(newItems[i]);            
  23348.         var translators = search.getTranslators();
  23349.         if(translators.length) {
  23350.             search.setTranslator(translators);
  23351.             search.translate();
  23352.         } else {
  23353.             // add doc as attachment
  23354.             newItems[i].attachments.push({document:doc});
  23355.             newItems[i].complete();
  23356.             // call next
  23357.             completeItems(newItems, useIndices, couldUseFullItems);
  23358.         }
  23359.     } else {
  23360.         // add doc as attachment
  23361.         newItems[i].attachments.push({document:doc});
  23362.         newItems[i].complete();
  23363.         // call next
  23364.         completeItems(newItems, useIndices, couldUseFullItems);
  23365.     }
  23366. }
  23367.  
  23368. function doWeb(doc, url) {
  23369.     var newItems = new Array();
  23370.     var needFullItems = new Array();
  23371.     var couldUseFullItems = new Array();
  23372.     
  23373.     var spanTags = doc.getElementsByTagName("span");
  23374.     
  23375.     for(var i=0; i<spanTags.length; i++) {
  23376.         var spanClass = spanTags[i].getAttribute("class");
  23377.         if(spanClass) {
  23378.             var spanClasses = spanClass.split(" ");
  23379.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  23380.                 var spanTitle = spanTags[i].getAttribute("title");
  23381.                 var newItem = new Zotero.Item();
  23382.                 newItem.repository = false;    // do not save repository
  23383.                 if(Zotero.Utilities.parseContextObject(spanTitle, newItem)) {
  23384.                     if(newItem.title) {
  23385.                         if(!newItem.creators.length) {
  23386.                             // if we have a title but little other identifying
  23387.                             // information, say we''ll get full item later
  23388.                             newItem.contextObject = spanTitle;
  23389.                             couldUseFullItems[newItems.length] = true;
  23390.                         }
  23391.                         
  23392.                         // title and creators are minimum data to avoid looking up
  23393.                         newItems.push(newItem);
  23394.                     } else {
  23395.                         // retrieve full item
  23396.                         newItem.contextObject = spanTitle;
  23397.                         needFullItems.push(newItem);
  23398.                     }
  23399.                 }
  23400.             }
  23401.         }
  23402.     }
  23403.     
  23404.     Zotero.debug(needFullItems);
  23405.     if(needFullItems.length) {
  23406.         // retrieve full items asynchronously
  23407.         Zotero.wait();
  23408.         retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc);
  23409.     } else {
  23410.         completeCOinS(newItems, couldUseFullItems, doc);
  23411.     }
  23412. }');
  23413.  
  23414. REPLACE INTO translators VALUES ('e7e01cac-1e37-4da6-b078-a0e8343b0e98', '1.0.0b4.r1', '', '2007-08-04 23:15:00', '1', '200', '4', 'unAPI', 'Simon Kornblith', '', 
  23415. 'var RECOGNIZABLE_FORMATS = ["mods", "marc", "endnote", "ris", "bibtex", "rdf"];
  23416. var FORMAT_GUIDS = {
  23417.     "mods":"0e2235e7-babf-413c-9acf-f27cce5f059c",
  23418.     "marc":"a6ee60df-1ddc-4aae-bb25-45e0537be973",
  23419.     "endnote":"881f60f2-0802-411a-9228-ce5f47b64c7d",
  23420.     "ris":"32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7",
  23421.     "bibtex":"9cb70025-a888-4a29-a210-93ec52da40d4",
  23422.     "rdf":"5e3ad958-ac79-463d-812b-a86a9235c28f"
  23423. };
  23424.  
  23425. var unAPIResolver, unsearchedIds, foundIds, foundItems, foundFormat, foundFormatName;
  23426.  
  23427. function detectWeb(doc, url) {
  23428.     // initialize variables
  23429.     unsearchedIds = [];
  23430.     foundIds = [];
  23431.     foundItems = [];
  23432.     foundFormat = [];
  23433.     foundFormatName = [];
  23434.     
  23435.     var nsResolver = doc.createNSResolver(doc.documentElement);
  23436.     
  23437.     // look for a resolver
  23438.     unAPIResolver = doc.evaluate(''//link[@rel="unapi-server"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23439.     if(!unAPIResolver) return false;
  23440.     unAPIResolver = unAPIResolver.getAttribute("href");
  23441.     
  23442.     // look for abbrs
  23443.     var abbrs = doc.getElementsByTagName("abbr");
  23444.     for each(var abbr in abbrs) {
  23445.         if(abbr.getAttribute && abbr.getAttribute("class") &&
  23446.            abbr.getAttribute("class").split(" ").indexOf("unapi-id") != -1 && abbr.getAttribute("title")) {
  23447.             // found an abbr
  23448.             unsearchedIds.push(escape(abbr.getAttribute("title")));
  23449.         }
  23450.     }
  23451.     
  23452.     if(!unsearchedIds.length) return false;
  23453.     
  23454.     // now we need to see if the server actually gives us bibliographic metadata.
  23455.     
  23456.     // one way to signal this is with a META tag
  23457.     var zoteroMeta = doc.evaluate(''//meta[@name="ZoteroItemType"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23458.     if(zoteroMeta) return zoteroMeta.getAttribute("content");
  23459.     
  23460.     // otherwise, things will be a bit more complicated, and we''ll have to do some HTTP requests
  23461.     Zotero.wait();
  23462.     
  23463.     if(unsearchedIds.length == 1) {
  23464.         // if there''s only one abbr tag, we should go ahead and retrieve types for it
  23465.         getItemType();
  23466.     } else {
  23467.         // if there''s more than one, we should first see if the resolver gives metadata for all of them
  23468.         Zotero.Utilities.HTTP.doGet(unAPIResolver, function(text) {
  23469.             var format = checkFormats(text);
  23470.             if(format) {
  23471.                 // move unsearchedIds to foundIds
  23472.                 foundIds = unsearchedIds;
  23473.                 unsearchedIds = [];
  23474.                 // save format and formatName
  23475.                 foundFormat = format[0];
  23476.                 foundFormatName = format[1];
  23477.                 
  23478.                 Zotero.done("multiple");
  23479.             } else {
  23480.                 getItemType();
  23481.             }
  23482.         });
  23483.     }
  23484. }
  23485.  
  23486. function getItemType() {
  23487.     // if there are no items left to search, use the only item''s type (if there is one) or give up
  23488.     if(!unsearchedIds.length) {
  23489.         if(foundIds.length) {
  23490.             getOnlyItem();
  23491.         } else {
  23492.             Zotero.done(false);
  23493.         }
  23494.         return;
  23495.     }
  23496.     
  23497.     var id = unsearchedIds.shift();
  23498.     Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id, function(text) {
  23499.         var format = checkFormats(text);
  23500.         if(format) {
  23501.             // save data
  23502.             foundIds.push(id);
  23503.             foundFormat.push(format[0]);
  23504.             foundFormatName.push(format[1]);
  23505.             
  23506.             if(foundIds.length == 2) {
  23507.                 // this is our second; use multiple
  23508.                 Zotero.done("multiple");
  23509.                 return;
  23510.             }
  23511.         }
  23512.         
  23513.         // keep going
  23514.         getItemType();
  23515.     });
  23516. }
  23517.  
  23518. function checkFormats(text) {
  23519.     text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  23520.     var xml = new XML(text);
  23521.     
  23522.     var foundFormat = new Object();
  23523.     
  23524.     // this is such an ugly, disgusting hack, and I hate how Mozilla decided to neuter an ECMA standard
  23525.     for each(var format in xml.format) {
  23526.         var name = format.@name.toString();
  23527.         var lowerName = name.toLowerCase();
  23528.         
  23529.         if(format.@namespace_uri == "http://www.loc.gov/mods/v3" || lowerName == "mods" || format.@docs == "http://www.loc.gov/standards/mods/") {
  23530.             if(!foundFormat["mods"] || lowerName.indexOf("full") != -1) {
  23531.                 foundFormat["mods"] = escape(name);
  23532.             }
  23533.         } else if(lowerName.match(/^marc\b/)) {
  23534.             if(!foundFormat["marc"] || lowerName.indexOf("utf8") != -1) {
  23535.                 foundFormat["marc"] = escape(name);
  23536.             }
  23537.         } else if(lowerName == "rdf_dc") {
  23538.             foundFormat["rdf"] = escape(name);
  23539.         } else if(format.@docs.text() == "http://www.refman.com/support/risformat_intro.asp" || lowerName.match(/^ris\b/)) {
  23540.             if(!foundFormat["ris"] || lowerName.indexOf("utf8") != -1) {
  23541.                 foundFormat["ris"] = escape(name);
  23542.             }
  23543.         } else if(lowerName == "bibtex") {
  23544.             foundFormat["bibtex"] = escape(name);
  23545.         } else if(lowerName == "endnote") {
  23546.             foundFormat["endnote"] = escape(name);
  23547.         }
  23548.     }
  23549.     
  23550.     // loop through again, this time respecting preferences
  23551.     for each(var format in RECOGNIZABLE_FORMATS) {
  23552.         if(foundFormat[format]) return [format, foundFormat[format]];
  23553.     }
  23554.     
  23555.     return false;
  23556. }
  23557.  
  23558. function getOnlyItem() {
  23559.     // retrieve the only item
  23560.     retrieveItem(foundIds[0], foundFormat[0], foundFormatName[0], function(obj, item) {
  23561.         foundItems.push(item);
  23562.         Zotero.done(item.itemType);
  23563.     });
  23564. }
  23565.  
  23566. function retrieveItem(id, format, formatName, callback) {
  23567.     // retrieve URL
  23568.     Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id+"&format="+formatName, function(text) {
  23569.         var translator = Zotero.loadTranslator("import");
  23570.         translator.setTranslator(FORMAT_GUIDS[format]);
  23571.         translator.setString(text);
  23572.         translator.setHandler("itemDone", callback);
  23573.         translator.translate();
  23574.     });
  23575. }', 
  23576. '/**
  23577.  * Get formats and names for all usable ids; when done, get all items
  23578.  **/
  23579. function getAllIds() {
  23580.     if(!unsearchedIds.length) {
  23581.         // once all ids have been gotten, get all items
  23582.         getAllItems();
  23583.         return;
  23584.     }
  23585.     
  23586.     var id = unsearchedIds.shift();
  23587.     Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id, function(text) {
  23588.         var format = checkFormats(text);
  23589.         if(format) {
  23590.             // save data
  23591.             foundIds.push(id);
  23592.             foundFormat.push(format[0]);
  23593.             foundFormatName.push(format[1]);
  23594.         }
  23595.         
  23596.         // keep going
  23597.         getAllIds();
  23598.     });
  23599. }
  23600.  
  23601. /**
  23602.  * Get all items; when done, show selectItems or scrape
  23603.  **/
  23604. function getAllItems() {
  23605.     if(foundItems.length == foundIds.length) {
  23606.         if(foundItems.length == 1) {
  23607.             // if only one item, send complete()
  23608.             foundItems[0].complete();
  23609.         } else if(foundItems.length > 0) {
  23610.             // if multiple items, show selectItems
  23611.             var itemTitles = [];
  23612.             for(var i in foundItems) {
  23613.                 itemTitles[i] = foundItems[i].title;
  23614.             }
  23615.             
  23616.             var chosenItems = Zotero.selectItems(itemTitles);
  23617.             if(!chosenItems) Zotero.done(true);
  23618.             
  23619.             for(var i in chosenItems) {
  23620.                 foundItems[i].complete();
  23621.             }
  23622.         }
  23623.         
  23624.         // reset items
  23625.         foundItems = [];
  23626.         
  23627.         Zotero.done();
  23628.         return;
  23629.     }
  23630.     
  23631.     var id = foundIds[foundItems.length];
  23632.     // foundFormat can be either a string or an array
  23633.     if(typeof(foundFormat) == "string") {
  23634.         var format = foundFormat;
  23635.         var formatName = foundFormatName;
  23636.     } else {
  23637.         var format = foundFormat[foundItems.length];
  23638.         var formatName = foundFormatName[foundItems.length];
  23639.     }
  23640.     
  23641.     // get item
  23642.     retrieveItem(id, format, formatName, function(obj, item) {
  23643.         foundItems.push(item);
  23644.         getAllItems();
  23645.     });
  23646. }
  23647.  
  23648. function doWeb() {
  23649.     Zotero.wait();
  23650.     
  23651.     // retrieve data for all ids
  23652.     getAllIds();
  23653. }');
  23654.  
  23655. REPLACE INTO translators VALUES ('a326fc49-60c2-405b-8f44-607e5d18b9ad', '1.0.0b4.r5', '', '2008-01-25 20:00:00', '0', '100', '4', 'Code4Lib Journal', 'Michael Berkowitz', 'http://journal.code4lib.org/', 
  23656. 'function detectWeb(doc, url) {
  23657.     if (doc.evaluate(''//h2[@class="articletitle"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  23658.         return "multiple";
  23659.     } else if (doc.evaluate(''//h1[@class="articletitle"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  23660.         return "journalArticle";
  23661.     }
  23662. }', 
  23663. 'function doWeb(doc, url) {
  23664.     var items = new Object();
  23665.     var articles = new Array();
  23666.     var xpath = ''//div[@class="article"]/h2[@class="articletitle"]/a'';
  23667.     if (detectWeb(doc, url) == "multiple") {
  23668.         var xpath = ''//div[@class="article"]/h2[@class="articletitle"]/a'';
  23669.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  23670.         var next_title = titles.iterateNext();
  23671.         while (next_title) {
  23672.             items[next_title.href] = next_title.textContent;
  23673.             next_title = titles.iterateNext();
  23674.         }
  23675.         
  23676.         items = Zotero.selectItems(items);
  23677.         for (var i in items) {
  23678.             articles.push(i);
  23679.         }
  23680.     } else {
  23681.         articles.push(url);
  23682.     }
  23683.     
  23684.     Zotero.Utilities.processDocuments(articles, function(newDoc, url) {
  23685.         var newItem = new Zotero.Item("journalArticle");
  23686.         newItem.repository = "Code4Lib Journal";
  23687.         newItem.publicationTitle = "The Code4Lib Journal";
  23688.         newItem.ISSN = "1940-5758";
  23689.         newItem.url = newDoc.location.href;
  23690.         newItem.title = newDoc.evaluate(''//div[@class="article"]/h1[@class="articletitle"]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  23691.         newItem.abstractNote = newDoc.evaluate(''//div[@class="article"]/div[@class="abstract"]/p'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  23692.         var issdate = newDoc.evaluate(''//p[@id="issueDesignation"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  23693.         newItem.issue = issdate.match(/([^,]*)/)[0].match(/\d+/)[0];
  23694.         newItem.date = issdate.match(/,\s+(.*)$/)[1];
  23695.         
  23696.         
  23697.         var axpath = ''//div[@class="article"]/div[@class="entry"]/p[1]/a'';
  23698.         var authors = newDoc.evaluate(axpath, newDoc, null, XPathResult.ANY_TYPE, null);
  23699.         var next_author = authors.iterateNext();
  23700.         while (next_author) {
  23701.             newItem.creators.push(Zotero.Utilities.cleanAuthor(next_author.textContent, "author"));
  23702.             next_author = authors.iterateNext();
  23703.         }
  23704.         
  23705.         newItem.attachments.push({url:newDoc.location.href, title:"Code4Lib Journal Snapshot", mimeType:"text/html"});
  23706.         newItem.complete();
  23707.     }, function() {Zotero.done;});
  23708.     Zotero.wait();
  23709. }');
  23710.  
  23711. REPLACE INTO translators VALUES ('c3edb423-f267-47a1-a8c2-158c247f87c2', '1.0.0b4.r5', '', '2008-11-06 04:25:00', '0', '100', '4', 'Common-Place', 'Frederick Gibbs', 'http://www.common-place\.|historycooperative\.org/journals/cp', 
  23712. 'function detectWeb(doc, url) {
  23713.     if(doc.title.indexOf("Previous Issues") != -1 || doc.title.indexOf("Search Site") != -1 ) {
  23714.         return "multiple";
  23715.     } else {
  23716.         return "journalArticle";
  23717.     }
  23718. }', 
  23719. 'function scrape(doc) {
  23720.     
  23721.     var namespace = doc.documentElement.namespaceURI;
  23722.     var nsResolver = namespace ? function(prefix) {
  23723.         if (prefix == ''x'') return namespace; else return null;
  23724.     } : null;
  23725.     
  23726.     var newItem = new Zotero.Item("journalArticle");
  23727.     newItem.publicationTitle = "Common-Place";
  23728.     newItem.url = doc.location.href;
  23729.  
  23730.  
  23731.     //get issue year and month
  23732.     //these will determine what xpaths we use for title and author
  23733.     var pubDate;
  23734.     var dateRe = /<a href="\/vol-[0-9]{2}\/no-[0-9]{2}\/">(.*)<\/a><\/b>/;
  23735.     var m = dateRe.exec(Zotero.Utilities.trimInternal(doc.getElementsByTagName("body")[0].innerHTML));
  23736.  
  23737.     if(m) {
  23738.         //newItem.title = Zotero.Utilities.trimInternal(Zotero.Utilities.unescapeHTML(m[1]));
  23739.         pubDate = m[1];
  23740.     } else {
  23741.     pubDate = doc.evaluate(''//div[@id="container"]/div[@id="top"]/p/b/a[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  23742.     }
  23743.     var d;
  23744.     //Zotero.debug(pubDate);
  23745.     pubDateVolRE = /vol. (.*) ┬╖ no. /;
  23746.     d = pubDateVolRE.exec(pubDate);
  23747.     newItem.volume = d[1];
  23748.  
  23749.     pubDateVolRE = /no. (.*) ┬╖/;
  23750.     d = pubDateVolRE.exec(pubDate);
  23751.     newItem.issue = d[1];
  23752.  
  23753.     pubDateVolRE = /no. [0-9] ┬╖ (.*)/;
  23754.     d = pubDateVolRE.exec(pubDate);
  23755.     newItem.date = d[1];
  23756.  
  23757.     //usually the page begins with the article title or book title (of reviewed book)
  23758.     //some pages have an image just before them, so we need to skip it if it''s there.
  23759.     var pLevel;
  23760.     var m=doc.evaluate(''//div[@id="content"]/p[1]/img'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23761.     
  23762.     //if there is an image here, offset the xpath
  23763.     if (m == null) {
  23764.         pLevel = ''//div[@id="content"]/p[1]'';
  23765.     } else { 
  23766.         pLevel = ''//div[@id="content"]/p[2]'';
  23767.     }
  23768.     
  23769.     //issues before 2004 have a table based layout, so a totally different xpath.
  23770.     //check to see if we have anything, then try again if we don''t.
  23771.     var author;
  23772.     var title;
  23773.         
  23774.     author = doc.evaluate(pLevel+''/span[1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  23775.     author = author.iterateNext();
  23776.  
  23777.     if (author != null) {
  23778.         //Zotero.debug("au"+author+"au");
  23779.         var title = doc.evaluate(pLevel+''/span[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  23780.         //Zotero.debug("ti"+title+"ti");
  23781.         title = title.iterateNext().textContent;        
  23782.  
  23783.         //determine if we have a book review
  23784.         // if so, get the publication information
  23785.         if (author.textContent.indexOf("Review by") != -1 ) {
  23786.             newItem.title = String.concat("Review of ", title);
  23787.             newItem.author = author.textContent.substring(10);
  23788.         } else {
  23789.             newItem.author = author.textContent;
  23790.             newItem.title = title;
  23791.         }
  23792.  
  23793.     }    
  23794.     else { //we have older issue
  23795.         
  23796.         //check if we are on a review
  23797.         var review = doc.evaluate(''/html/body/table/tbody/tr/td[2]/p[2]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  23798.         var temp = review.textContent;
  23799.         if (temp.indexOf("Review") != -1) {
  23800.             title = doc.evaluate(''/html/body/table/tbody/tr/td[2]/p/i'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  23801.             title = "Review of " + title; 
  23802.             author = review.textContent.substring(10);
  23803.         } else { //for articles
  23804.             title = doc.evaluate(''/html/body/table/tbody/tr/td[2]/p/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  23805.             author = doc.evaluate(''/html/body/table/tbody/tr/td[2]/p[1]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/)[1];
  23806.             //Zotero.debug(author);    
  23807.         }
  23808.         newItem.author = author;
  23809.         newItem.title = title;
  23810.     }
  23811.     
  23812.     newItem.attachments.push({document:doc, title:doc.title});
  23813.     
  23814.     newItem.complete();
  23815. }
  23816.  
  23817. function doWeb(doc, url) {
  23818. var type = detectWeb(doc, url);
  23819. if (type == "multiple") {
  23820.         
  23821.     var namespace = doc.documentElement.namespaceURI;
  23822.     var nsResolver = namespace ? function(prefix) {
  23823.         if (prefix == ''x'') return namespace; else return null;
  23824.     } : null;
  23825.     
  23826.         //create list of items
  23827.         //what about home page (current issue table of contents?)
  23828.         //for search result links: /html/body/table[2]/tbody/tr/td[2]/li[3]/a
  23829.         //for previous issues: //tr/td/p/a/b (but we need to strip out volume links (starts with ''Volume'')
  23830.         
  23831.     var link;
  23832.     var title;
  23833.     var items = new Object();
  23834.     var searchLinks = doc.evaluate(''/html/body/table[2]/tbody/tr/td[2]/li/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  23835.  
  23836.         while (elmt = searchLinks.iterateNext()) {
  23837.             Zotero.debug(elmt.textContent);
  23838.             title = elmt.textContent;
  23839.             link = elmt.href;
  23840.             if (title && link){
  23841.                 items[link] = title;
  23842.             }
  23843.         }
  23844.         
  23845.         items = Zotero.selectItems(items);
  23846.         
  23847.         if(!items) {
  23848.             return true;
  23849.         }
  23850.         
  23851.         var uris = new Array();
  23852.         for(var i in items) {
  23853.             uris.push(i);
  23854.         }
  23855.         
  23856.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  23857.             function() { Zotero.done(); }, null);
  23858.         
  23859.         Zotero.wait();
  23860.     } else {
  23861.         scrape(doc);
  23862.     }
  23863. }');
  23864.  
  23865.  
  23866. REPLACE INTO translators VALUES ('dede653d-d1f8-411e-911c-44a0219bbdad', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'GPO Access e-CFR', 'Bill McKinney', '^http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+', 
  23867. 'function detectWeb(doc, url) {
  23868.     var re = new RegExp("^http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx");
  23869.     if(re.test(doc.location.href)) {
  23870.         return "book";
  23871.     } else {
  23872.         return "multiple";
  23873.     }
  23874. }', 
  23875. 'function get_nextsibling(n)
  23876.   {
  23877.   var x=n.nextSibling;
  23878.   while (x.nodeType!=1)
  23879.    {
  23880.    x=x.nextSibling;
  23881.    }
  23882.   return x;
  23883. }
  23884. function scrape(doc) {
  23885.  
  23886.     var newItem = new Zotero.Item("statute");
  23887.     newItem.url = doc.location.href;
  23888.     var extraText = new String();
  23889.     var tmpSection = "";
  23890.     newItem.code = "Electronic Code of Federal Regulations";
  23891.     newItem.language = "en-us";
  23892.     
  23893.     var spanTags = doc.getElementsByTagName("span");
  23894.     for(var i=0; i<spanTags.length; i++) {
  23895.         if (spanTags[i].className == "mainheader") {
  23896.             var tmpStr = spanTags[i].innerHTML;
  23897.             tmpStr = tmpStr.replace(/\ /g, " ");
  23898.             tmpStr = tmpStr.replace(/\&\#167;/g, "Sec.");
  23899.             newItem.codeNumber = tmpStr;
  23900.             newItem.title = "e-CFR: " + tmpStr;
  23901.         }
  23902.         if (spanTags[i].className == "div5head") {
  23903.             var tmpStr = spanTags[i].childNodes[0].innerHTML;
  23904.             tmpStr = tmpStr.replace(/\ /g, " ");
  23905.             tmpStr = tmpStr.replace(/\&\#167;/g, "Sec.");
  23906.             tmpSection = tmpStr;
  23907.         }
  23908.     }
  23909.  
  23910.     var heading5Tags = doc.getElementsByTagName("h5");
  23911.     for(var i=0; i<heading5Tags.length; i++) {
  23912.         var tmpStr = heading5Tags[0].innerHTML;
  23913.         tmpStr = tmpStr.replace(/\ /g, " ");
  23914.         tmpStr = tmpStr.replace(/\&\#167;/g, "Sec.");
  23915.         if (tmpSection != "") {
  23916.             tmpSection = tmpSection + " - ";
  23917.         }
  23918.         newItem.section = tmpSection + tmpStr;
  23919.         break;
  23920.     }
  23921.  
  23922.     // statutory source
  23923.     var boldTags = doc.getElementsByTagName("b");
  23924.     for(var i=0; i<boldTags.length; i++) {
  23925.         var s = new String(boldTags[i].innerHTML);
  23926.         if (s.indexOf("Source:") > -1) {
  23927.             newItem.history = "Source: " + boldTags[i].nextSibling.nodeValue;
  23928.         }
  23929.         if (s.indexOf("Authority:") > -1) {
  23930.             newItem.extra = "Authority: " + boldTags[i].nextSibling.nodeValue;
  23931.         }
  23932.     }
  23933.  
  23934.     newItem.complete();
  23935. }
  23936.  
  23937. function doWeb(doc, url) {
  23938.     var re = new RegExp("http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+");
  23939.     if(re.test(doc.location.href)) {
  23940.         scrape(doc);
  23941.     } else {
  23942.         var items = Zotero.Utilities.getItemArray(doc, doc,"http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+");
  23943.         items = Zotero.selectItems(items);
  23944.         
  23945.         if(!items) {
  23946.             return true;
  23947.         }
  23948.         
  23949.         var uris = new Array();
  23950.         for(var i in items) {
  23951.             uris.push(i);
  23952.         }
  23953.         
  23954.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  23955.             function() { Zotero.done(); }, null);
  23956.         
  23957.         Zotero.wait();
  23958.     }
  23959. }');
  23960.  
  23961. REPLACE INTO translators VALUES ('5ed5ab01-899f-4a3b-a74c-290fb2a1c9a4', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'AustLII and NZLII', 'Bill McKinney', 'http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+', 
  23962. 'function detectWeb(doc, url) {
  23963.     var namespace = doc.documentElement.namespaceURI;
  23964.     var nsResolver = namespace ? function(prefix) {
  23965.         if (prefix == ''x'') return namespace; else return null;
  23966.     } : null;
  23967.     
  23968.     var austliiRegexp = /^http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+/
  23969.     if(austliiRegexp.test(url)) {
  23970.         return "book";
  23971.     } else {
  23972.         var aTags = doc.getElementsByTagName("a");
  23973.         for(var i=0; i<aTags.length; i++) {
  23974.             if(articleRegexp.test(aTags[i].href)) {
  23975.                 return "multiple";
  23976.             }
  23977.         }
  23978.     }
  23979. }
  23980. ', 
  23981. 'function scrape(doc) {
  23982.  
  23983.     var namespace = doc.documentElement.namespaceURI;
  23984.     var nsResolver = namespace ? function(prefix) {
  23985.         if (prefix == ''x'') return namespace; else return null;
  23986.     } : null;
  23987.     
  23988.     var newItem = new Zotero.Item("case");
  23989.     newItem.title = doc.title;
  23990.     newItem.url = doc.location.href;
  23991.  
  23992.     var titleRegexp = /^(.+)\s+\[(\d+)\]\s+(\w+)\s(\d+)\s+\((\d+)\s+(\w+)\s+(\d+)\)/
  23993.     var titleMatch = titleRegexp .exec(doc.title);
  23994.     if (titleMatch ) {
  23995.         newItem.caseName = titleMatch[1] + " [" + titleMatch[2] + "] " + titleMatch[3] + " " + titleMatch[4];
  23996.         newItem.dateDecided = titleMatch[7] + " " + titleMatch[6] + " " + titleMatch[5];
  23997.         newItem.court = titleMatch[3];    
  23998.     } else {
  23999.         newItem.caseName = doc.title;
  24000.         newItem.dateDecided = "not found";
  24001.     }
  24002.     
  24003.     newItem.complete();
  24004. }
  24005.  
  24006. function doWeb(doc, url) {
  24007.     var austliiRegexp = /^http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+/
  24008.     if(austliiRegexp.test(url)) {
  24009.         scrape(doc);
  24010.     } else {
  24011.         
  24012.         var items = Zotero.Utilities.getItemArray(doc, doc, austliiRegexp);
  24013.         items = Zotero.selectItems(items);
  24014.         
  24015.         if(!items) {
  24016.             return true;
  24017.         }
  24018.         
  24019.         var urls = new Array();
  24020.         for(var i in items) {
  24021.             urls.push(i);
  24022.         }
  24023.         
  24024.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  24025.         Zotero.wait();
  24026.     }
  24027. }');
  24028.  
  24029. REPLACE INTO translators VALUES ('5ae63913-669a-4792-9f45-e089a37de9ab', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'BAILII', 'Bill McKinney', 'http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+', 
  24030. 'function detectWeb(doc, url) {
  24031.     var namespace = doc.documentElement.namespaceURI;
  24032.     var nsResolver = namespace ? function(prefix) {
  24033.         if (prefix == ''x'') return namespace; else return null;
  24034.     } : null;
  24035.     
  24036.     var liiRegexp= /^http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+/
  24037.     if(liiRegexp.test(url)) {
  24038.         return "book";
  24039.     } else {
  24040.         var aTags = doc.getElementsByTagName("a");
  24041.         for(var i=0; i<aTags.length; i++) {
  24042.             if(articleRegexp.test(aTags[i].href)) {
  24043.                 return "multiple";
  24044.             }
  24045.         }
  24046.     }
  24047. }', 
  24048. 'function scrape(doc) {
  24049.  
  24050.     var namespace = doc.documentElement.namespaceURI;
  24051.     var nsResolver = namespace ? function(prefix) {
  24052.         if (prefix == ''x'') return namespace; else return null;
  24053.     } : null;
  24054.     
  24055.     var newItem = new Zotero.Item("case");
  24056.     newItem.title = doc.title;
  24057.     newItem.url = doc.location.href;
  24058.  
  24059.     var titleRegexp = /^(.+)\s+\[(\d+)\]\s+(.+)\s+\((\d+)\s+(\w+)\s+(\d+)\)/
  24060.     var titleMatch = titleRegexp .exec(doc.title);
  24061.     if (titleMatch ) {
  24062.         newItem.caseName = titleMatch[1] + " [" + titleMatch[2] + "] " + titleMatch[3];
  24063.         newItem.dateDecided = titleMatch[4] + " " + titleMatch[5] + " " + titleMatch[6];
  24064.     } else {
  24065.         newItem.caseName = doc.title;
  24066.         newItem.dateDecided = "not found";
  24067.     }
  24068.  
  24069.     var courtRegexp = /cases\/([^\/]+)\/([^\/]+)\//
  24070.     var courtMatch = courtRegexp.exec(doc.location.href);
  24071.     if (courtMatch) {
  24072.         var divRegexp = /\w+/
  24073.         var divMatch = divRegexp.exec(courtMatch[2]);
  24074.         if (divMatch) {
  24075.             newItem.court = courtMatch[1] + " (" + courtMatch[2] + ")";
  24076.         } else {
  24077.             newItem.court = courtMatch[1];
  24078.         }
  24079.     } else {
  24080.         newItem.court = "not found";
  24081.     }
  24082.     
  24083.     // judge
  24084.     var panel = doc.getElementsByTagName("PANEL");
  24085.     if (panel.length > 0) {
  24086.         var tmp = panel[0].innerHTML;
  24087.         newItem.creators.push({lastName:tmp, creatorType:"judge", fieldMode:true});
  24088.         
  24089.     }
  24090.     // citation
  24091.     var cite = doc.getElementsByTagName("CITATION");
  24092.     if (cite.length > 0) {
  24093.         var tmpc = cite[0].childNodes[0].innerHTML;
  24094.         newItem.notes.push({note:tmpc});
  24095.     }
  24096.     
  24097.     newItem.complete();
  24098. }
  24099.  
  24100. function doWeb(doc, url) {
  24101.     var liiRegexp= /http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+/
  24102.     if(liiRegexp.test(url)) {
  24103.         scrape(doc);
  24104.     } else {
  24105.         
  24106.         var items = Zotero.Utilities.getItemArray(doc, doc, liiRegexp);
  24107.         items = Zotero.selectItems(items);
  24108.         
  24109.         if(!items) {
  24110.             return true;
  24111.         }
  24112.         
  24113.         var urls = new Array();
  24114.         for(var i in items) {
  24115.             urls.push(i);
  24116.         }
  24117.         
  24118.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  24119.         Zotero.wait();
  24120.     }
  24121. }');
  24122.  
  24123. REPLACE INTO translators VALUES ('84799379-7bc5-4e55-9817-baf297d129fe', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'CanLII', 'Bill McKinney', 'http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+', 
  24124. 'function detectWeb(doc, url) {
  24125.     var namespace = doc.documentElement.namespaceURI;
  24126.     var nsResolver = namespace ? function(prefix) {
  24127.         if (prefix == ''x'') return namespace; else return null;
  24128.     } : null;
  24129.     
  24130.     var canLiiRegexp = /http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+/
  24131.     if(canLiiRegexp .test(url)) {
  24132.         return "book";
  24133.     } else {
  24134.         var aTags = doc.getElementsByTagName("a");
  24135.         for(var i=0; i<aTags.length; i++) {
  24136.             if(articleRegexp.test(aTags[i].href)) {
  24137.                 return "multiple";
  24138.             }
  24139.         }
  24140.     }
  24141. }
  24142. ', 
  24143. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  24144.     var field = metaTags.namedItem(field);
  24145.     if(field) {
  24146.         newItem[zoteroField] = field.getAttribute("content");
  24147.     }
  24148. }
  24149.  
  24150. function scrape(doc) {
  24151.  
  24152.     var namespace = doc.documentElement.namespaceURI;
  24153.     var nsResolver = namespace ? function(prefix) {
  24154.         if (prefix == ''x'') return namespace; else return null;
  24155.     } : null;
  24156.     
  24157.     var newItem = new Zotero.Item("case");
  24158.     
  24159.     var metaTags = doc.getElementsByTagName("meta");
  24160.     associateMeta(newItem, metaTags, "DC.Title", "title");
  24161.     associateMeta(newItem, metaTags, "DC.Date", "dateDecided");
  24162.     associateMeta(newItem, metaTags, "DC.Language", "language");
  24163.     newItem.url = doc.location.href;
  24164.     
  24165.     var field = metaTags.namedItem("DC.Title");
  24166.     var tmpText = "";
  24167.     if(field) {
  24168.         tmpText = field.getAttribute("content");
  24169.         var capRe = /^(.+),\s+(\d{4})\s+(\w+)\s+(\d+)\s+\(([^\)]+)\)/;
  24170.             var m = capRe.exec(tmpText);
  24171.             if(m) {
  24172.                 
  24173.                 newItem.caseName = m[1]+", "+m[2]+" "+m[3]+" "+m[4];
  24174.                 if (m[3] == ''CanLII'') {
  24175.                     newItem.court = m[5];
  24176.                 } else {
  24177.                     newItem.court = m[3];
  24178.                 }
  24179.                 
  24180.             } else {
  24181.                 newItem.caseName = tmpText;
  24182.                 newItem.court = "not found";
  24183.             }
  24184.     }
  24185.     
  24186.     
  24187.     
  24188.     // attach link to pdf version
  24189.     // NOTE: not working - don''t know why
  24190.     var pdfRe = /^(.+)\.html$/;
  24191.     var pdfMatch = pdfRe.exec(doc.location.href);
  24192.     if (pdfMatch) {
  24193.         var pdfUrl = pdfMatch[1]+".pdf";
  24194.         newItem.attachments = [{url:pdfUrl, title:"PDF version", mimeType:"application/pdf"}];
  24195.     }
  24196.     
  24197.     newItem.complete();
  24198. }
  24199.  
  24200. function doWeb(doc, url) {
  24201.     var canLiiRegexp= /http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+/
  24202.     if(canLiiRegexp.test(url)) {
  24203.         scrape(doc);
  24204.     } else {
  24205.         
  24206.         var items = Zotero.Utilities.getItemArray(doc, doc, canLiiRegexp);
  24207.         items = Zotero.selectItems(items);
  24208.         
  24209.         if(!items) {
  24210.             return true;
  24211.         }
  24212.         
  24213.         var urls = new Array();
  24214.         for(var i in items) {
  24215.             urls.push(i);
  24216.         }
  24217.         
  24218.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  24219.         Zotero.wait();
  24220.     }
  24221. }');
  24222.  
  24223. REPLACE INTO translators VALUES ('930d49bc-44a1-4c22-9dde-aa6f72fb11e5', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'Cornell LII', 'Bill McKinney', '^http://www\.law\.cornell\.edu/supct/html/.+', 
  24224. 'function detectWeb(doc, url) {
  24225.     var namespace = doc.documentElement.namespaceURI;
  24226.     var nsResolver = namespace ? function(prefix) {
  24227.         if (prefix == ''x'') return namespace; else return null;
  24228.     } : null;
  24229.     
  24230.     var liiRegexp = /http:\/\/www\.law\.cornell\.edu\/supct\/html\/.+/
  24231.     if(liiRegexp.test(url)) {
  24232.         return "book";
  24233.     } else {
  24234.         var aTags = doc.getElementsByTagName("a");
  24235.         for(var i=0; i<aTags.length; i++) {
  24236.             if(articleRegexp.test(aTags[i].href)) {
  24237.                 return "multiple";
  24238.             }
  24239.         }
  24240.     }
  24241. }', 
  24242. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  24243.     var field = metaTags.namedItem(field);
  24244.     if(field) {
  24245.         newItem[zoteroField] = field.getAttribute("content");
  24246.     }
  24247. }
  24248.  
  24249. function scrape(doc) {
  24250.  
  24251.     var caselawCourt = "U.S. Supreme Court";
  24252.     var caselawJurisdiction = "Federal";
  24253.     var caselawSourceReporter = "U.S.";
  24254.     var caselawSourceVolume = "___";
  24255.     var caselawSourceStartPage = "___";
  24256.     var caselawParallelSourceVolume = "___";
  24257.     var caselawParallelSourceStartPage = "___";
  24258.     var caselawParallelSourceReporter = "___";
  24259.     var caselawDecisionYear = "";
  24260.     
  24261.     var newItem = new Zotero.Item("case");
  24262.     newItem.url = doc.location.href;
  24263.     newItem.language = "en-us";
  24264.     newItem.court = "U.S. Supreme Court";
  24265.     newItem.reporter = "U.S.";
  24266.     
  24267.     // LII provides a bunch of meta tags to harvest
  24268.     var metaTags = doc.getElementsByTagName("meta");
  24269.     associateMeta(newItem, metaTags, "CASENAME", "title");
  24270.     associateMeta(newItem, metaTags, "CASENAME", "caseName");
  24271.     //associateMeta(newItem, metaTags, "DOCKET", "caselawDocket");
  24272.     //associateMeta(newItem, metaTags, "PARTY1", "caselawParty1");
  24273.     //associateMeta(newItem, metaTags, "PARTY2", "caselawParty2");
  24274.     //associateMeta(newItem, metaTags, "ARGDATE", "caselawArguedDate");
  24275.     //associateMeta(newItem, metaTags, "DECDATE", "dateDecided");
  24276.     associateMeta(newItem, metaTags, "COURTBELOW", "history");
  24277.     //associateMeta(newItem, metaTags, "ACTION", "caselawCourtAction");
  24278.  
  24279.  
  24280.     var tmpCasename = newItem.caseName;
  24281.     tmpCasename = Zotero.Utilities.capitalizeTitle(tmpCasename.toLowerCase());
  24282.     tmpCasename = tmpCasename.replace("V.", "v.");
  24283.     newItem.caseName = tmpCasename;
  24284.     newItem.shortTitle = tmpCasename;
  24285.     
  24286.     // judge
  24287.     var j = metaTags.namedItem("AUTHOR");
  24288.     if(j) {
  24289.         newItem.creators.push({lastName:j.getAttribute("content"), creatorType:"judge", fieldMode:true});
  24290.     }
  24291.  
  24292.     // group meta tags
  24293.     for(var i=0; i<metaTags.length; i++) {
  24294.         var key = metaTags[i].getAttribute("name");
  24295.         var value = metaTags[i].getAttribute("content");
  24296.         if (key == "GROUP") {
  24297.             newItem.tags.push(value);        
  24298.         }
  24299.     }
  24300.     
  24301.     // parse year out of decision date
  24302.     var decdateField = metaTags.namedItem("DECDATE");
  24303.     if(decdateField ) {
  24304.         var decisionYearRegex = /(\w+)\s+(\d+),\s+(\d+)/
  24305.         var decisionDateMatch = decisionYearRegex.exec(decdateField.getAttribute("content"));
  24306.         var dy;
  24307.         var dm;
  24308.         var dd;
  24309.         if (decisionDateMatch ) {
  24310.             dm = decisionDateMatch[1];
  24311.             dd = decisionDateMatch[2];
  24312.             dy = decisionDateMatch [3];
  24313.             caselawDecisionYear = dy;
  24314.             newItem.dateDecided = dy + " " + dm + " " + dd;
  24315.         }
  24316.     }
  24317.  
  24318.     // create attachment to pdf
  24319.     var dyRegex = /^(.+)\/html\/(.+)(\.Z\w+)\.html$/;
  24320.     var dyMatch = dyRegex.exec(newItem.url);
  24321.     if (dyMatch) {
  24322.         var pdfUrl = dyMatch[1]+"/pdf/"+dyMatch[2]+"P"+dyMatch[3];
  24323.         newItem.attachments.push({url:pdfUrl, title:"PDF version", mimeType:"application/pdf", downloadable:true});
  24324.     }
  24325.  
  24326.     // parse disposition
  24327.     var dis = doc.getElementsByTagName("DISPOSITION");
  24328.     if (dis.length > 0) {
  24329.         var tmpDis = dis[0].innerHTML;
  24330.         tmpDis = tmpDis.replace(/\s+/g, " ");
  24331.         newItem.title = newItem.title + " (" +    tmpDis + ")";    
  24332.         newItem.caseName= newItem.caseName + " (" +    tmpDis + ")";    
  24333.         
  24334.     }
  24335.     
  24336.     
  24337.     // parse citation into parts so that bluebook can be constructed
  24338.     var cite = doc.getElementsByTagName("CASENUMBER");
  24339.     if (cite.length > 0) {
  24340.             var citeRegex = /([0-9]+)\s+U\.S\.\s+([0-9]+)/;
  24341.             var citeMatch = citeRegex.exec(cite[0].innerHTML);
  24342.             if (citeMatch) {
  24343.                 caselawSourceVolume = citeMatch[1];
  24344.                 newItem.reporterVolume = citeMatch[1];
  24345.                 caselawSourceStartPage = citeMatch[2];
  24346.                 newItem.firstPage = citeMatch[2];
  24347.             }
  24348.     }
  24349.     
  24350.     // look for offcite span element
  24351.     var spanTags = doc.getElementsByTagName("span");
  24352.     if (spanTags.length > 0) {
  24353.         for(var i=0; i<spanTags.length; i++) {
  24354.             if(spanTags[i].className == "offcite") {
  24355.                 var citeRegex = /([0-9]+)\s+U\.S\.\s+([0-9]+)/;
  24356.                 var citeMatch = citeRegex.exec(spanTags[i].innerHTML);
  24357.                 if (citeMatch) {
  24358.                     caselawSourceVolume = citeMatch[1];
  24359.                     newItem.reporterVolume = citeMatch[1];
  24360.                     caselawSourceStartPage = citeMatch[2];
  24361.                     newItem.firstPage = citeMatch[2];
  24362.                 }
  24363.                 break;    
  24364.             }
  24365.         }
  24366.     }
  24367.     
  24368.     // bluebook citation    
  24369.     var bbCite = newItem.shortTitle + ", " + 
  24370.         caselawSourceVolume + " " + 
  24371.         caselawSourceReporter + " " + 
  24372.         caselawSourceStartPage;
  24373.     // paralell cite    
  24374.     if (caselawParallelSourceVolume != "___") {
  24375.         bbCite = bbCite + ", " + caselawParallelSourceVolume +
  24376.         " " + caselawParallelSourceReporter + " " +
  24377.         caselawParallelSourceStartPage;
  24378.     }    
  24379.     // jurisdiction and year
  24380.     bbCite = bbCite + " (" + caselawDecisionYear + ")";
  24381.     // closing period
  24382.     bbCite = "Bluebook citation: " + bbCite + ".";
  24383.     newItem.notes.push({note:bbCite});
  24384.     
  24385.     // parse out publication notice
  24386.     var notice = doc.getElementsByTagName("NOTICE");
  24387.     if (notice .length > 0) {
  24388.         var tmpNotice= notice [0].innerHTML;
  24389.         tmpNotice= tmpNotice.replace(/\s+/g, " ");
  24390.         newItem.notes.push({note:tmpNotice});        
  24391.     }
  24392.     
  24393.     newItem.complete();
  24394. }
  24395.  
  24396. function doWeb(doc, url) {
  24397.     var liiRegexp = /http:\/\/www\.law\.cornell\.edu\/supct\/html\/.+/
  24398.     if(liiRegexp.test(url)) {
  24399.         scrape(doc);
  24400.     } else {
  24401.         
  24402.         var items = Zotero.Utilities.getItemArray(doc, doc, liiRegexp);
  24403.         items = Zotero.selectItems(items);
  24404.         
  24405.         if(!items) {
  24406.             return true;
  24407.         }
  24408.         
  24409.         var urls = new Array();
  24410.         for(var i in items) {
  24411.             urls.push(i);
  24412.         }
  24413.         
  24414.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  24415.         Zotero.wait();
  24416.     }
  24417. }');
  24418.  
  24419. REPLACE INTO translators VALUES ('232e24fe-2f68-44fc-9366-ecd45720ee9e', '1.0.0b4.r1', '', '2007-06-21 06:30:00', '0', '100', '4', 'Patents - USPTO', 'Bill McKinney', '^http://patft\.uspto\.gov/netacgi/nph-Parser.+', 
  24420. 'function detectWeb(doc, url) {
  24421.     var re = new RegExp("^http://patft\.uspto\.gov/netacgi/nph-Parser");
  24422.     if(re.test(doc.location.href)) {
  24423.         return "book";
  24424.     } else {
  24425.         return "multiple";
  24426.     }
  24427. }', 
  24428. 'function get_nextsibling(n)
  24429.   {
  24430.   var x=n.nextSibling;
  24431.   while (x.nodeType!=1)
  24432.    {
  24433.    x=x.nextSibling;
  24434.    }
  24435.   return x;
  24436. }
  24437.  
  24438. function scrape(doc) {
  24439.  
  24440.     var newItem = new Zotero.Item("patent");
  24441.     newItem.url = doc.location.href;
  24442.     var extraText = new String();
  24443.     var tmpStr = new String();
  24444.     var tmpRefs = "";
  24445.     var tmpTitle = doc.title;
  24446.     
  24447.     var fontTags = doc.getElementsByTagName("font");
  24448.     for(var i=0; i<fontTags.length; i++) {
  24449.         if (fontTags[i].getAttribute("size") == "+1") {
  24450.             tmpTitle = tmpTitle + " - " + fontTags[i].innerHTML;
  24451.         }
  24452.     }
  24453.     tmpTitle = Zotero.Utilities.cleanString(tmpTitle);
  24454.     tmpTitle = tmpTitle.replace(/<[^>]+>/g, "");
  24455.     newItem.title = tmpTitle;
  24456.     
  24457.     var cellTags = doc.getElementsByTagName("td");
  24458.     for(var i=0; i<cellTags.length; i++) {
  24459.  
  24460.         var s = new String(cellTags[i].innerHTML);
  24461.         if (s.indexOf("United States Patent") > -1) {
  24462.             
  24463.             tmpStr = cellTags[i+1].childNodes[0].innerHTML;
  24464.             tmpStr = tmpStr.replace(/<[^>]+>/gi, "");
  24465.             tmpStr = tmpStr.replace(/,/gi, "");
  24466.             newItem.patentNumber = tmpStr;
  24467.             
  24468.             tmpStr = cellTags[i+3].innerHTML;
  24469.             tmpStr = tmpStr.replace(/<[^>]+>/gi, "");
  24470.             newItem.issueDate = tmpStr;
  24471.             continue;
  24472.         }
  24473.         if (s.indexOf("Assignee") > -1) {
  24474.             tmpStr = cellTags[i+1].innerHTML;
  24475.             tmpStr = tmpStr.replace(/<\/?\w+>/gi, "");
  24476.             newItem.assignee = tmpStr;
  24477.             continue;
  24478.         }
  24479.         if (s.indexOf("Inventors") > -1) {
  24480.             tmpStr = cellTags[i+1].innerHTML;
  24481.             
  24482.             var inventors = tmpStr.split(/<b>,/ig);
  24483.             for (var j=0; j<inventors.length; j++) {
  24484.                 var tmpInventor = inventors[j];
  24485.                 tmpInventor = tmpInventor.replace(/<\/?\w+>/gi, "");
  24486.                 tmpInventor = tmpInventor.replace(/\([^\)]+\)/gi, "");
  24487.                 tmpInventor = tmpInventor.replace(/^\s+/gi, "");
  24488.                 
  24489.                 var names = tmpInventor.split(";");
  24490.                 if (names) {
  24491.                     var lname = names[0];
  24492.                     var fname = names[1];
  24493.                     lname = lname.replace(/^\s+/gi, "");
  24494.                     lname = lname.replace(/\s+$/gi, "");
  24495.                     fname= fname.replace(/^\s+/gi, "");
  24496.                     fname= fname.replace(/\s+$/gi, "");
  24497.                     newItem.creators.push({lastName:lname, firstName:fname, creatorType:"inventor"});
  24498.                 }
  24499.             }
  24500.             continue;
  24501.         }
  24502.         
  24503.         // references
  24504.         if (s.indexOf("<a href=\"/netacgi/nph-Parser?Sect2") > -1) {
  24505.                 tmpRefs = tmpRefs + cellTags[i].childNodes[0].innerHTML + " ";
  24506.         }
  24507.         if (s.indexOf("<a href=\"http://appft1.uspto.gov/netacgi/nph-Parser?TERM1") > -1) {
  24508.                 tmpRefs = tmpRefs + cellTags[i].childNodes[0].innerHTML + " ";
  24509.         }
  24510.     }
  24511.     
  24512.     var centerTags = doc.getElementsByTagName("center");
  24513.     for(var i=0; i<centerTags.length; i++) {
  24514.         var s = new String(centerTags[i].innerHTML);
  24515.         if (s.indexOf("Abstract") > -1) {
  24516.             //newItem.extra = "ok";
  24517.             var el = get_nextsibling(centerTags[i]);
  24518.             newItem.abstractNote = el.innerHTML;
  24519.         }
  24520.     
  24521.     }
  24522.  
  24523.     newItem.references = tmpRefs;
  24524.     newItem.complete();
  24525. }
  24526.  
  24527. function doWeb(doc, url) {
  24528.     var re = new RegExp("^http://patft\.uspto\.gov/netacgi/nph-Parser.+");
  24529.     if(re.test(doc.location.href)) {
  24530.         scrape(doc);
  24531.     } else {
  24532.         var items = Zotero.Utilities.getItemArray(doc, doc, "^http://patft\.uspto\.gov/netacgi/nph-Parser.+");
  24533.         items = Zotero.selectItems(items);
  24534.         
  24535.         if(!items) {
  24536.             return true;
  24537.         }
  24538.         
  24539.         var uris = new Array();
  24540.         for(var i in items) {
  24541.             uris.push(i);
  24542.         }
  24543.         
  24544.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  24545.             function() { Zotero.done(); }, null);
  24546.         
  24547.         Zotero.wait();
  24548.     }
  24549. }');
  24550.  
  24551. REPLACE INTO translators VALUES ('3e684d82-73a3-9a34-095f-19b112d88bbf', '1.0.0b3.r1', '', '2009-02-03 05:45:00', 1, 100, 4, 'Google Books', 'Simon Kornblith and Michael Berkowitz', '^http://(books|www)\.google\.[a-z]+(\.[a-z]+)?/books\?(.*id=.*|.*q=.*)',
  24552. 'function detectWeb(doc, url) {
  24553.     var re = new RegExp(''^http://(books|www)\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)'', ''i'');
  24554.     if(re.test(doc.location.href)) {
  24555.         return "book";
  24556.     } else {
  24557.         return "multiple";
  24558.     }
  24559. }',
  24560. 'function doWeb(doc, url) {
  24561.     // get local domain suffix
  24562.     var psRe = new RegExp("https?://(books|www)\.google\.([^/]+)/");
  24563.     var psMatch = psRe.exec(url);
  24564.     var suffix = psMatch[2];
  24565.     var prefix = psMatch[1];
  24566.     var uri = doc.location.href;
  24567.     var newUris = new Array();
  24568.     
  24569.     var re = new RegExp(''^http://(?:books|www)\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)'', ''i'');
  24570.     var m = re.exec(uri);
  24571.     if(m) {
  24572.         newUris.push(''http://''+prefix+''.google.''+suffix+''/books?id=''+m[2]);
  24573.     } else {
  24574.         var items = Zotero.Utilities.getItemArray(doc, doc, ''http://''+prefix+''\\.google\\.'' + suffix + ''/books\\?id=([^&]+)'', ''^(?:All matching pages|About this Book|Table of Contents|Index)'');
  24575.         // Drop " - Page" thing
  24576.         for(var i in items) {
  24577.             items[i] = items[i].replace(/- Page [0-9]+\s*$/, "");
  24578.         }
  24579.         items = Zotero.selectItems(items);
  24580.         
  24581.         if(!items) {
  24582.             return true;
  24583.         }
  24584.         
  24585.         for(var i in items) {
  24586.             var m = re.exec(i);
  24587.             newUris.push(''http://''+prefix+''.google.''+suffix+''/books?id=''+m[2]);
  24588.         }
  24589.     }
  24590.     Zotero.debug(newUris);
  24591.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  24592.         var newItem = new Zotero.Item("book");
  24593.         newItem.extra = "";
  24594.         
  24595.         var namespace = newDoc.documentElement.namespaceURI;
  24596.         var nsResolver = namespace ? function(prefix) {
  24597.           if (prefix == ''x'') return namespace; else return null;
  24598.         } : null;
  24599.  
  24600.         var xpath = ''//h2[@class="title"]''
  24601.         var elmt;    
  24602.         if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver,
  24603.                                     XPathResult.ANY_TYPE, null).iterateNext()){
  24604.             var title = Zotero.Utilities.superCleanString(elmt.textContent);
  24605.             newItem.title = title;
  24606.             Zotero.debug("title: " + title);
  24607.         }
  24608.         xpath = ''//div[@class="titlewrap"]/span[@class="addmd"]''
  24609.         if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver,
  24610.                                     XPathResult.ANY_TYPE, null).iterateNext()){
  24611.             var authors = Zotero.Utilities.superCleanString(elmt.textContent);
  24612.             if (authors.substring(0, 3) == "By "){
  24613.                 authors = authors.substring(3);
  24614.             }
  24615.             authors = authors.split(", ");
  24616.             for(j in authors) {
  24617.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
  24618.             }
  24619.         }
  24620.         
  24621.         xpath = ''//td[2][@id="bookinfo"]/div[@class="bookinfo_sectionwrap"]/div'';
  24622.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
  24623.                                     XPathResult.ANY_TYPE, null);
  24624.         while(elmt = elmts.iterateNext()) {
  24625.             var fieldelmt = newDoc.evaluate(''.//text()'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24626.             if(fieldelmt) {
  24627.                 field = Zotero.Utilities.superCleanString(fieldelmt.nodeValue);
  24628.                 Zotero.debug("output: " + field);
  24629.                 if(field.substring(0,10) == "Published ") {
  24630.                     newItem.date = field.substring(field.length-4);
  24631.                     var publisher = newDoc.evaluate(''..//a'', fieldelmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24632.                     if (publisher){
  24633.                         publisher =  Zotero.Utilities.superCleanString(publisher.textContent);
  24634.                         newItem.publisher = publisher;
  24635.                     }
  24636.                 } else if(field.substring(0,5) == "ISBN ") {
  24637.                     newItem.ISBN = field.substring(5);
  24638.                 } else if(field.substring(field.length-6) == " pages") {
  24639.                     newItem.pages = field.substring(0, field.length-6);
  24640.                 } else if(field.substring(0,12) == "Contributor ") {
  24641.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(field.substring(12), "contributor"));
  24642.                 }
  24643.             }
  24644.         }        
  24645.         newItem.complete();
  24646.     }, function() { Zotero.done(); }, null);
  24647.     
  24648.     Zotero.wait();
  24649. }');
  24650.  
  24651.  
  24652. REPLACE INTO translators VALUES ('57a00950-f0d1-4b41-b6ba-44ff0fc30289', '1.0.0b3.r1', '', '2009-02-21 09:30:00', 1, 100, 4, 'Google Scholar', 'Simon Kornblith', 'http://scholar\.google\.(?:com|com?\.[a-z]{2}|[a-z]{2})/scholar',
  24653. 'function detectWeb(doc, url) {
  24654.     return "multiple";
  24655. }',
  24656. 'var haveEndNoteLinks;
  24657.  
  24658. function scrape(doc) {
  24659.     var nsResolver = doc.createNSResolver(doc.documentElement);
  24660.     
  24661.     var items = new Array();
  24662.     var itemGrabLinks = new Array();
  24663.     var itemGrabLink;
  24664.     var links = new Array();
  24665.     var types = new Array();
  24666.     
  24667.     var itemTypes = new Array();
  24668.     var attachments = new Array();
  24669.     
  24670.     var titles = doc.evaluate(''//h3[@class="r"]'', doc, nsResolver,
  24671.                 XPathResult.ANY_TYPE, null);
  24672.     var elmts = doc.evaluate(''//a[contains(@href, ".enw")]'',
  24673.                 doc, nsResolver, XPathResult.ANY_TYPE, null);
  24674.     var title;
  24675.     var i = 0;
  24676.     while(title = titles.iterateNext()) {        
  24677.         itemGrabLinks[i] = elmts.iterateNext().href;
  24678.         items[i] = title.textContent;
  24679.         var link = doc.evaluate(''.//a'',
  24680.                 title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24681.         if (link){
  24682.             links[i] = link.href;
  24683.         }
  24684.         i++;
  24685.     }
  24686.     
  24687.     items = Zotero.selectItems(items);
  24688.     
  24689.     if(!items) {
  24690.         if(Zotero.done) Zotero.done(true);
  24691.         return true;
  24692.     }
  24693.     
  24694.     var urls = new Array();
  24695.     for(var i in items) {
  24696.         // get url
  24697.         urls.push(itemGrabLinks[i]);
  24698.         if(links[i]) {
  24699.             attachments.push([{title:"Google Scholar Linked Page", type:"text/html",
  24700.                               url:links[i]}]);
  24701.         } else {
  24702.             attachments.push([]);
  24703.         }
  24704.     }
  24705.     
  24706.     var translator = Zotero.loadTranslator("import");
  24707.     translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  24708.     translator.setHandler("itemDone", function(obj, item) {
  24709.         item.attachments = attachments.shift();
  24710.         item.complete();
  24711.     });
  24712.     Zotero.Utilities.HTTP.doGet(urls, function(text) {
  24713.         translator.setString(text);
  24714.         translator.translate();
  24715.     }, function() { Zotero.done() });
  24716. }
  24717.  
  24718. function doWeb(doc, url) {
  24719.     var nsResolver = doc.createNSResolver(doc.documentElement);
  24720.     
  24721.     //SR:Will use preference setting url instead of cookie to get EndNote links (works with ezproxy, doesn''t overwrite other prefs)
  24722.     //doc.cookie = "GSP=ID=deadbeefdeadbeef:IN=ebe89f7e83a8fe75+7e6cc990821af63:CF=3; domain=.scholar.google.com";
  24723.     
  24724.     // determine if we need to reload the page
  24725.     
  24726.     // first check for EndNote links
  24727.     haveEndNoteLinks = doc.evaluate(''//a[contains(@href, ".enw")]'', 
  24728.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24729.     if(!haveEndNoteLinks) {
  24730.             // SR:Commenting out this bit as code for retrieving citations from "Related" links is unreliable and unnecessary
  24731.             //// next check if there are docs with no related articles
  24732.             //if(doc.evaluate(''''//p[@class="g"][not(descendant-or-self::text() = "Related Articles")]'''',
  24733.             //    doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  24734.             
  24735.         // SR:Set preferences to show import links in English and do page reload
  24736.         // (bit of a hack as it overwrites user prefs for language and import link type)
  24737.         url = url.replace (/hl\=[^&]*&?/, "");
  24738.         url = url.replace("scholar?", "scholar_setprefs?hl=en&scis=yes&scisf=3&submit=Save+Preferences&");
  24739.         haveEndNoteLinks = true;
  24740.         Zotero.Utilities.loadDocument(url, scrape);
  24741.         Zotero.wait();
  24742.         return;
  24743.             //}
  24744.     }
  24745.     
  24746.     scrape(doc, url);
  24747.     Zotero.wait();
  24748. }');
  24749.  
  24750.  
  24751. REPLACE INTO translators VALUES ('9c335444-a562-4f88-b291-607e8f46a9bb', '1.0.0b3.r1', '', '2008-07-02 11:00:00', '1', '100', '4', 'Berkeley Library Catalog', 'Simon Kornblith', '^https?://[^/]*berkeley.edu[^/]*/WebZ/(?:html/results.html|FETCH)\?.*sessionid=', 
  24752. 'function detectWeb(doc, url) {
  24753.     var resultsRegexp = /\/WebZ\/html\/results.html/i
  24754.     if(resultsRegexp.test(url)) {
  24755.         return "multiple";
  24756.     } else {
  24757.         return "book";
  24758.     }
  24759. }', 
  24760. 'function reformURL(url) {
  24761.     return url.replace(/fmtclass=[^&]*/, "")+":fmtclass=marc";
  24762. }
  24763.  
  24764. function doWeb(doc, url) {
  24765.     var resultsRegexp = /\/WebZ\/html\/results.html/i
  24766.     
  24767.     if(resultsRegexp.test(url)) {
  24768.         var items = Zotero.Utilities.getItemArray(doc, doc, "/WebZ/FETCH", "^[0-9]*$");
  24769.         items = Zotero.selectItems(items);
  24770.         
  24771.         if(!items) {
  24772.             return true;
  24773.         }
  24774.         
  24775.         var urls = new Array();
  24776.         for(var i in items) {
  24777.             urls.push(reformURL(i));
  24778.         }
  24779.     } else {
  24780.         var urls = [reformURL(url)];
  24781.     }
  24782.     
  24783.     var translator = Zotero.loadTranslator("import");
  24784.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  24785.     var marc = translator.getTranslatorObject();
  24786.     
  24787.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  24788.         var uri = newDoc.location.href;
  24789.         
  24790.         var namespace = newDoc.documentElement.namespaceURI;
  24791.         var nsResolver = namespace ? function(prefix) {
  24792.           if (prefix == ''x'') return namespace; else return null;
  24793.         } : null;
  24794.         
  24795.         var elmts = newDoc.evaluate(''//table/tbody/tr[@valign="top"]'',
  24796.                                  newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  24797.         
  24798.         var record = new marc.record();
  24799.         while(elmt = elmts.iterateNext()) {
  24800.             var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  24801.             var value = newDoc.evaluate(''./TD[2]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  24802.             // remove spacing
  24803.             value = value.replace(/^\s+/, "");
  24804.             value = value.replace(/\s+$/, "");
  24805.             if(field == 0) {
  24806.                 record.leader = "00000"+value;
  24807.             } else {
  24808.                 var ind = value[3]+value[5];
  24809.                 if (value.match(/^\d{1,2}\s{3}/)) value = Zotero.Utilities.cleanString(value.replace(/^\d{1,2}\s{3}/, ""));
  24810.                 value = value.replace(/\$([a-z0-9]) /g, marc.subfieldDelimiter+"$1");
  24811.                 if(value[0] != marc.subfieldDelimiter) {
  24812.                     value = marc.subfieldDelimiter+"a"+value;
  24813.                 }
  24814.                 record.addField(field, ind, value);
  24815.             }
  24816.         }
  24817.         
  24818.         var newItem = new Zotero.Item();
  24819.         record.translate(newItem);
  24820.         var oldTags = newItem.tags;
  24821.         var newTags = new Array();
  24822.         for each (var tag in oldTags) {
  24823.             if (newTags.indexOf(tag) == -1) newTags.push(tag)
  24824.         }
  24825.         newItem.tags = newTags;
  24826.         newItem.repository = "Berkeley Library Catalog";
  24827.         
  24828.         newItem.complete();
  24829.     }, function() { Zotero.done(); }, null);
  24830.     
  24831.     Zotero.wait();
  24832. }');
  24833.  
  24834.  
  24835. REPLACE INTO translators VALUES ('d0b1914a-11f1-4dd7-8557-b32fe8a3dd47', '1.0.0b3.r1', '', '2009-01-05 21:20:00', 1, 100, 4, 'EBSCOhost', 'Simon Kornblith and Michael Berkowitz', 'https?://[^/]+/(?:bsi|ehost)/(?:results|detail|folder)',
  24836. 'function detectWeb(doc, url) {
  24837.     var namespace = doc.documentElement.namespaceURI;
  24838.     var nsResolver = namespace ? function(prefix) {
  24839.         if (prefix == ''x'') return namespace; else return null;
  24840.     } : null;
  24841.     
  24842.     // See if this is a search results or folder results page
  24843.     var searchResult = doc.evaluate(''//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]'', doc, nsResolver,
  24844.                                     XPathResult.ANY_TYPE, null).iterateNext();         
  24845.     if(searchResult) {
  24846.         return "multiple";
  24847.     }
  24848. /*
  24849.     var xpath = ''//div[@class="citation-wrapping-div"]/dl[@class="citation-fields"]/dt[starts-with(text(), "Persistent link to this record")''
  24850.         +'' or starts-with(text(), "V├¡nculo persistente a este informe")''
  24851.         +'' or starts-with(text(), "Lien permanent ├á cette donn├⌐e")''
  24852.         +'' or starts-with(text(), "Permanenter Link zu diesem Datensatz")''
  24853.         +'' or starts-with(text(), "Link permanente al record")''
  24854.         +'' or starts-with(text(), "Link permanente para este registro")''
  24855.         +'' or starts-with(text(), "µ£¼Φ¿ÿΘîäσ¢║σ«ÜΘÇúτ╡É")''
  24856.         +'' or starts-with(text(), "µ¡ñΦ«░σ╜òτÜäµ░╕Σ╣àΘô╛µÄÑ")''
  24857.         +'' or starts-with(text(), "πüôπü«πâ¼πé│πâ╝πâëπü╕πü«πâæπâ╝πé╖πé╣πé┐πâ│πâê πâ¬πâ│πé»")''
  24858.         +'' or starts-with(text(), "δáê∞╜öδô£ δºüφü¼ URL")''
  24859.         +'' or starts-with(text(), "╨ƒ╨╛╤ü╤é╨╛╤Å╨╜╨╜╨░╤Å ╤ü╤ü╤ï╨╗╨║╨░ ╨╜╨░ ╤ì╤é╤â ╨╖╨░╨┐╨╕╤ü╤î")''
  24860.         +'' or starts-with(text(), "Bu kayda s├╝rekli ba─ƒlant─▒")''
  24861.         +'' or starts-with(text(), "╬£╧î╬╜╬╣╬╝╬┐╧é ╧â╧ì╬╜╬┤╬╡╧â╬╝╬┐╧é ╧â╬╡ ╬▒╧à╧ä╧î ╧ä╬┐ ╬▒╧ü╧ç╬╡╬»╬┐")]'';
  24862. */
  24863.     var xpath = ''//input[@id="ctl00_ctl00_MainContentArea_MainContentArea_topDeliveryControl_deliveryButtonControl_lnkExportImage"]'';    
  24864.     var persistentLink = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24865.     if(persistentLink) {
  24866.         return "journalArticle";
  24867.     }
  24868. }',
  24869. 'var customViewStateMatch = /<input type="hidden" name="__CUSTOMVIEWSTATE" id="__CUSTOMVIEWSTATE" value="([^"]+)" \/>/
  24870. var host;
  24871.  
  24872. function fullEscape(text) {
  24873.     return escape(text).replace(/\//g, "%2F").replace(/\+/g, "%2B");
  24874. }
  24875.  
  24876. function generateDeliverString(nsResolver, doc){    
  24877.     var hiddenInputs = doc.evaluate(''//input[@type="hidden" and not(contains(@name, "folderHas"))]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  24878.     var hiddenInput;
  24879.     var deliverString ="";
  24880.     while(hiddenInput = hiddenInputs.iterateNext()) {
  24881.         deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+encodeURIComponent(hiddenInput.value) + "&";
  24882.     }
  24883.     var otherHiddenInputs = doc.evaluate(''//input[@type="hidden" and contains(@name, "folderHas")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  24884.     while(hiddenInput = otherHiddenInputs.iterateNext()) {
  24885.         deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+escape(hiddenInput.value).replace(/\//g, "%2F").replace(/%20/g, "+") + "&";
  24886.     }
  24887.  
  24888.  
  24889.     deliverString = deliverString
  24890.         +"&ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExportImage.x=5"
  24891.         +"&ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExportImage.y=14";
  24892.             
  24893.     return deliverString;
  24894. }
  24895.  
  24896. /*
  24897.  * given the text of the delivery page, downloads an item
  24898.  */
  24899. function downloadFunction(text) {
  24900.     var postLocation = /<form (?:autocomplete="o(?:ff|n)" )?name="aspnetForm" method="post" action="([^"]+)"/
  24901.     var m = postLocation.exec(text);
  24902.     var deliveryURL = m[1].replace(/&/g, "&");
  24903.     m = customViewStateMatch.exec(text);
  24904.     var downloadString = "__EVENTTARGET=&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+fullEscape(m[1])+"&__VIEWSTATE=&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24btnSubmit=Save&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24BibFormat=1&ajax=enabled";
  24905.     
  24906.     Zotero.Utilities.HTTP.doPost(host+"/ehost/"+deliveryURL,
  24907.                                  downloadString, function(text) {    // get marked records as RIS
  24908.         // load translator for RIS
  24909.         var test = text.match(/UR\s+\-(.*)/g);
  24910.         if (test[0].match("@")) text = text.replace(/UR\s+\-(.*)/, "");
  24911.         if (text.match(/AB\s\s\-/)) text = text.replace(/AB\s\s\-/, "N2  -");
  24912.         var translator = Zotero.loadTranslator("import");
  24913.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  24914.         translator.setString(text);
  24915.         translator.setHandler("itemDone", function(obj, item) {
  24916.             if (text.match("L3")) {
  24917.                 item.DOI = text.match(/L3\s+\-\s*(.*)/)[1];
  24918.             }
  24919.             item.itemType = "journalArticle";
  24920.             item.complete();
  24921.         });
  24922.         translator.translate();
  24923.         
  24924.         Zotero.done();
  24925.     });
  24926. }
  24927.  
  24928. function doWeb(doc, url) {
  24929.     var namespace = doc.documentElement.namespaceURI;
  24930.     var nsResolver = namespace ? function(prefix) {
  24931.         if (prefix == ''x'') return namespace; else return null;
  24932.     } : null;
  24933.  
  24934.     var hostRe = new RegExp("^(https?://[^/]+)/");
  24935.     var m = hostRe.exec(url);
  24936.     host = m[1];
  24937.                                     
  24938.     var searchResult = doc.evaluate(''//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]'', doc, nsResolver,
  24939.                                     XPathResult.ANY_TYPE, null).iterateNext();                              
  24940.  
  24941.     if(searchResult) {
  24942.         var titlex = ''//div[@class="result-list-record" or @class="folder-item-detail"]/span/a'';
  24943.         var titles = doc.evaluate(titlex, doc, nsResolver, XPathResult.ANY_TYPE, null);
  24944.         var items = new Object();
  24945.         var title;
  24946.         while (title = titles.iterateNext()) {
  24947.             items[title.href] = title.textContent;
  24948.         }
  24949.         
  24950.         var items = Zotero.selectItems(items);
  24951.         if(!items) {
  24952.             return true;
  24953.         }
  24954.  
  24955.         var uris = new Array();
  24956.         for(var i in items) {
  24957.             uris.push(i);
  24958.         }
  24959.         
  24960.         Zotero.Utilities.processDocuments(uris, function(newDoc){
  24961.             var postURL = newDoc.evaluate(''//form[@name="aspnetForm"]/@action'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24962.             postURL = host+"/ehost/"+postURL.nodeValue;
  24963.             var deliverString = generateDeliverString(nsResolver, newDoc);
  24964.             Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction);
  24965.         });
  24966.     } else {
  24967.         var postURL = doc.evaluate(''//form[@name="aspnetForm"]/@action'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  24968.         postURL = host+"/ehost/"+postURL.nodeValue;
  24969.         var deliverString = generateDeliverString(nsResolver, doc);
  24970.         Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction);
  24971.     }
  24972.     Zotero.wait();
  24973. }');
  24974.  
  24975.  
  24976. REPLACE INTO translators VALUES ('ce7a3727-d184-407f-ac12-52837f3361ff', '1.0.0b3.r1', '', '2008-04-18 08:55:00', '1', '100', '4', 'NYTimes.com', 'Simon Kornblith', '^http://(?:query\.nytimes\.com/search/query|(?:select\.|www\.)?nytimes\.com/.)', 
  24977. 'function detectWeb(doc, url) {
  24978.     if(doc.title.substr(0, 30) == "The New York Times: Search for") {
  24979.         var namespace = doc.documentElement.namespaceURI;
  24980.         var nsResolver = namespace ? function(prefix) {
  24981.             if (prefix == ''x'') return namespace; else return null;
  24982.         } : null;
  24983.         
  24984.         var result = doc.evaluate(''//div[@id="srchContent"]'', doc, nsResolver,
  24985.                      XPathResult.ANY_TYPE, null).iterateNext();
  24986.         if(result) {
  24987.             return "multiple";
  24988.         }
  24989.     } else {
  24990.         var metaTags = doc.getElementsByTagName("meta");
  24991.         if(metaTags.namedItem("hdl") && metaTags.namedItem("byl")) {
  24992.             return "newspaperArticle";
  24993.         }
  24994.     }
  24995. }', 
  24996. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  24997.     if(metaTags[field]) {
  24998.         newItem[zoteroField] = metaTags[field];
  24999.     }
  25000. }
  25001.  
  25002. function scrape(doc, url) {
  25003.     var newItem = new Zotero.Item("newspaperArticle");
  25004.     newItem.publicationTitle = "The New York Times";
  25005.     newItem.ISSN = "0362-4331";
  25006.     
  25007.     var metaTags = new Object();
  25008.     if(url != undefined) {
  25009.         newItem.url = url;
  25010.         var metaTagRe = /<meta[^>]*>/gi;
  25011.         var nameRe = /name="([^"]+)"/i;
  25012.         var contentRe = /content="([^"]+)"/i;
  25013.         var m = doc.match(metaTagRe);
  25014.         
  25015.         if(!m) {
  25016.             return;
  25017.         }
  25018.         
  25019.         for(var i=0; i<m.length; i++) {
  25020.             var name = nameRe.exec(m[i]);
  25021.             var content = contentRe.exec(m[i]);
  25022.             if(name && content) {
  25023.                 metaTags[name[1]] = content[1];
  25024.             }
  25025.         }
  25026.         
  25027.         if(!metaTags["hdl"]) {
  25028.             return;
  25029.         }
  25030.         
  25031.         newItem.attachments.push({url:url, title:"New York Times Snapshot",
  25032.                                    mimeType:"text/html"});
  25033.     } else {
  25034.         newItem.url = doc.location.href;
  25035.         var metaTagHTML = doc.getElementsByTagName("meta");
  25036.         for(var i=0; i<metaTagHTML.length; i++) {
  25037.             var key = metaTagHTML[i].getAttribute("name");
  25038.             var value = metaTagHTML[i].getAttribute("content");
  25039.             if(key && value) {
  25040.                 metaTags[key] = value;
  25041.             }
  25042.         }
  25043.     
  25044.         newItem.attachments.push({document:doc, title:"New York Times Snapshot"});
  25045.     }
  25046.     
  25047.     associateMeta(newItem, metaTags, "dat", "date");
  25048.     associateMeta(newItem, metaTags, "hdl", "title");
  25049.     associateMeta(newItem, metaTags, "dsk", "section");
  25050.     associateMeta(newItem, metaTags, "articleid", "accessionNumber");
  25051.     
  25052.     if(metaTags["byl"]) {
  25053.         var author = Zotero.Utilities.cleanString(metaTags["byl"]);
  25054.         if(author.substr(0, 3).toLowerCase() == "by ") {
  25055.             author = author.substr(3);
  25056.         }
  25057.         
  25058.         var authors = author.split(" and ");
  25059.         for each(var author in authors) {
  25060.             // fix capitalization
  25061.             var words = author.split(" ");
  25062.             for(var i in words) {
  25063.                 words[i] = words[i][0].toUpperCase()+words[i].substr(1).toLowerCase();
  25064.             }
  25065.             author = words.join(" ");
  25066.             
  25067.             if(words[0] == "The") {
  25068.                 newItem.creators.push({lastName:author, creatorType:"author", fieldMode:true});
  25069.             } else {
  25070.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  25071.             }
  25072.         }
  25073.     }
  25074.     
  25075.     if(metaTags["keywords"]) {
  25076.         var keywords = metaTags["keywords"];
  25077.         newItem.tags = keywords.split(",");
  25078.         for(var i in newItem.tags) {
  25079.             newItem.tags[i] = newItem.tags[i].replace("  ", ", ");
  25080.         }
  25081.     }
  25082.     
  25083.     newItem.complete();
  25084. }
  25085.  
  25086. function doWeb(doc, url) {
  25087.     if(doc.title.substr(0, 30) == "The New York Times: Search for") {
  25088.         var namespace = doc.documentElement.namespaceURI;
  25089.         var nsResolver = namespace ? function(prefix) {
  25090.             if (prefix == ''x'') return namespace; else return null;
  25091.         } : null;
  25092.         
  25093.         var result = doc.evaluate(''//div[@id="srchContent"]'', doc, nsResolver,
  25094.                      XPathResult.ANY_TYPE, null).iterateNext();
  25095.         var items = Zotero.Utilities.getItemArray(doc, result, ''^http://(?:select\.|www\.)nytimes.com/.*\.html(\\?|$)'');
  25096.         items = Zotero.selectItems(items);
  25097.             
  25098.         if(!items) {
  25099.             return true;
  25100.         }
  25101.         
  25102.         var urls = new Array();
  25103.         for(var i in items) {
  25104.             urls.push(i);
  25105.         }
  25106.         
  25107.         Zotero.Utilities.HTTP.doGet(urls, function(text, response, url) { scrape(text, url) }, function() { Zotero.done(); }, null);
  25108.         
  25109.         Zotero.wait();
  25110.     } else {
  25111.         scrape(doc);
  25112.     }
  25113. }');
  25114.  
  25115. REPLACE INTO translators VALUES ('1e6d1529-246f-4429-84e2-1f1b180b250d', '1.0.0b3.r1', '', '2006-12-12 23:41:00', 1, 100, 4, 'The Chronicle of Higher Education', 'Simon Kornblith', '^http://chronicle\.com/', 
  25116. 'function detectWeb(doc, url) {
  25117.     var articleRegexp = /^http:\/\/chronicle\.com\/(?:daily|weekly)\/[^/]+\//
  25118.     if(articleRegexp.test(url)) {
  25119.         if(doc.location.href.indexOf("weekly") != -1) {
  25120.             return "magazineArticle";
  25121.         } else {
  25122.             return "webpage";
  25123.         }
  25124.     } else {
  25125.         var aTags = doc.getElementsByTagName("a");
  25126.         for(var i=0; i<aTags.length; i++) {
  25127.             if(articleRegexp.test(aTags[i].href)) {
  25128.                 return "multiple";
  25129.             }
  25130.         }
  25131.     }
  25132. }',
  25133. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  25134.     if(metaTags.namedItem(field)) {
  25135.         newItem[zoteroField] = Zotero.Utilities.cleanString(metaTags.namedItem(field).getAttribute("content"));
  25136.     }
  25137. }
  25138.  
  25139. function scrape(doc) {
  25140.     if(doc.location.href.indexOf("weekly") != -1) {
  25141.         var newItem = new Zotero.Item("magazineArticle");
  25142.         
  25143.         var namespace = doc.documentElement.namespaceURI;
  25144.         var nsResolver = namespace ? function(prefix) {
  25145.             if (prefix == ''x'') return namespace; else return null;
  25146.         } : null;
  25147.         
  25148.         // go in search of pages
  25149.         var content = doc.evaluate(''/html/body/table[@class="layout"]/tbody/tr[1]/td[@class="content"]'',
  25150.                                    doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  25151.         if(content) {
  25152.             var pagesRegexp = /http:\/\/chronicle.com\nSection: [^\n]+\nVolume [0-9]+, Issue [0-9]+, Pages? ([A-Z0-9\-]+)/;
  25153.             var m = pagesRegexp.exec(content.textContent);
  25154.             if(m) {
  25155.                 newItem.pages = m[1];
  25156.             }
  25157.         }
  25158.     } else {
  25159.         var newItem = new Zotero.Item("webpage");
  25160.     }
  25161.     newItem.publicationTitle = "The Chronicle of Higher Education";
  25162.     newItem.ISSN = "0009-5982";
  25163.     
  25164.     newItem.url = doc.location.href;
  25165.     var metaTags = doc.getElementsByTagName("meta");
  25166.  
  25167.     newItem.attachments.push({document:doc, title:"Chronicle of Higher Education Snapshot"});
  25168.     
  25169.     associateMeta(newItem, metaTags, "published_date", "date");
  25170.     associateMeta(newItem, metaTags, "headline", "title");
  25171.     associateMeta(newItem, metaTags, "section", "section");
  25172.     associateMeta(newItem, metaTags, "volume", "volume");
  25173.     associateMeta(newItem, metaTags, "issue", "issue");
  25174.     
  25175.     if(metaTags.namedItem("byline")) {
  25176.         var author = Zotero.Utilities.cleanString(metaTags.namedItem("byline").getAttribute("content"));
  25177.         if(author.substr(0, 3).toLowerCase() == "by ") {
  25178.             author = author.substr(3);
  25179.         }
  25180.         
  25181.         var authors = author.split(" and ");
  25182.         for each(var author in authors) {
  25183.             // fix capitalization
  25184.             var words = author.split(" ");
  25185.             for(var i in words) {
  25186.                 words[i] = words[i][0].toUpperCase()+words[i].substr(1).toLowerCase();
  25187.             }
  25188.             author = words.join(" ");
  25189.             
  25190.             if(words[0] == "The") {
  25191.                 newItem.creators.push({lastName:author, creatorType:"author", fieldMode:true});
  25192.             } else {
  25193.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  25194.             }
  25195.         }
  25196.     }
  25197.     
  25198.     newItem.complete();
  25199. }
  25200.  
  25201. function doWeb(doc, url) {
  25202.     var articleRegexp = /^http:\/\/chronicle\.com\/(?:daily|weekly)\/[^/]+\//;
  25203.     if(articleRegexp.test(url)) {
  25204.         scrape(doc);
  25205.     } else {
  25206.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^http://chronicle\\.com/(?:daily|weekly)/[^/]+/'');
  25207.         items = Zotero.selectItems(items);
  25208.             
  25209.         if(!items) {
  25210.             return true;
  25211.         }
  25212.         
  25213.         var urls = new Array();
  25214.         for(var i in items) {
  25215.             urls.push(i);
  25216.         }
  25217.         
  25218.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  25219.         Zotero.wait();
  25220.     }
  25221. }');
  25222.  
  25223. REPLACE INTO translators VALUES ('4c164cc8-be7b-4d02-bfbf-37a5622dfd56', '1.0.0b3.r1', '', '2006-12-14 00:40:00', 1, 100, 4, 'The New York Review of Books', 'Simon Kornblith', '^https?://www\.nybooks\.com/', 
  25224. 'function detectWeb(doc, url) {
  25225.     var articleRegexp = /^http:\/\/www\.nybooks\.com\/articles\/[0-9]+\/?/
  25226.     if(articleRegexp.test(url)) {
  25227.         return "journalArticle";
  25228.     } else {
  25229.         var aTags = doc.getElementsByTagName("a");
  25230.         for(var i=0; i<aTags.length; i++) {
  25231.             if(articleRegexp.test(aTags[i].href)) {
  25232.                 return "multiple";
  25233.             }
  25234.         }
  25235.     }
  25236. }',
  25237. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  25238.     if(metaTags.namedItem(field)) {
  25239.         newItem[zoteroField] = Zotero.Utilities.cleanString(metaTags.namedItem(field).getAttribute("content"));
  25240.     }
  25241. }
  25242.  
  25243. function scrape(doc) {
  25244.     var newItem = new Zotero.Item("journalArticle");
  25245.     newItem.publicationTitle = "The New York Review of Books";
  25246.     newItem.ISSN = "0028-7504";
  25247.     
  25248.     var namespace = doc.documentElement.namespaceURI;
  25249.     var nsResolver = namespace ? function(prefix) {
  25250.         if (prefix == ''x'') return namespace; else return null;
  25251.     } : null;
  25252.     
  25253.     newItem.url = doc.location.href;
  25254.     var metaTags = doc.getElementsByTagName("meta");
  25255.  
  25256.     newItem.attachments.push({document:doc, title:"New York Review of Books Snapshot"});
  25257.     
  25258.     associateMeta(newItem, metaTags, "dc.title", "title");
  25259.     
  25260.     var info = doc.evaluate(''//div[@id="center-content"]/h4[@class="date"]'',
  25261.                                 doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  25262.     
  25263.     if(info) {
  25264.         // get date (which is in an a tag)
  25265.         newItem.date = doc.evaluate("./a", info, nsResolver, XPathResult.ANY_TYPE,
  25266.                                    null).iterateNext();
  25267.         if(newItem.date) {
  25268.             newItem.date = newItem.date.textContent;
  25269.         }
  25270.         
  25271.         info = Zotero.Utilities.cleanString(info.textContent);
  25272.         
  25273.         // get volume and issue
  25274.         var infoRe = /Volume ([0-9]+), Number ([0-9]+)/;
  25275.         var m = infoRe.exec(info);
  25276.         if(m) {
  25277.             newItem.volume = m[1];
  25278.             newItem.issue = m[2];
  25279.         }
  25280.     }
  25281.     
  25282.     
  25283.     var authors = doc.evaluate(''//div[@id="center-content"]/h4/a[substring(@href, 1, 9) = "/authors/"]'',
  25284.                                doc, nsResolver, XPathResult.ANY_TYPE, null);
  25285.     
  25286.     
  25287.     var author;
  25288.     while(author = authors.iterateNext()) {
  25289.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author", false));
  25290.     }
  25291.     
  25292.     newItem.complete();
  25293. }
  25294.  
  25295. function doWeb(doc, url) {
  25296.     var articleRegexp = /^http:\/\/www\.nybooks\.com\/articles\/[0-9]+/
  25297.     if(articleRegexp.test(url)) {
  25298.         scrape(doc);
  25299.     } else {
  25300.         var items = Zotero.Utilities.getItemArray(doc, doc, "^https?://www\\.nybooks\\.com/articles/[0-9]+/?");
  25301.         items = Zotero.selectItems(items);
  25302.             
  25303.         if(!items) {
  25304.             return true;
  25305.         }
  25306.         
  25307.         var urls = new Array();
  25308.         for(var i in items) {
  25309.             urls.push(i);
  25310.         }
  25311.         
  25312.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  25313.         Zotero.wait();
  25314.     }
  25315. }');
  25316.  
  25317. REPLACE INTO translators VALUES ('d1bf1c29-4432-4ada-8893-2e29fc88fd9e', '1.0.0b3.r1', '', '2007-06-21 20:10:00', 1, 100, 4, 'washingtonpost.com', 'Simon Kornblith', '^http://www\.washingtonpost\.com/', 
  25318. 'function detectWeb(doc, url) {
  25319.     var namespace = doc.documentElement.namespaceURI;
  25320.     var nsResolver = namespace ? function(prefix) {
  25321.         if (prefix == ''x'') return namespace; else return null;
  25322.     } : null;
  25323.     
  25324.     // don''t say we can scrape when we can''t; make sure user is logged in
  25325.     var signedIn = doc.evaluate(''//a[text() = "Sign out" or text() = "Sign Out"]'',
  25326.                                doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  25327.     if(!signedIn) {
  25328.         return;
  25329.     }
  25330.     
  25331.     var articleRegexp = /http:\/\/www\.washingtonpost\.com\/wp-dyn\/content\/article\/[0-9]+\/[0-9]+\/[0-9]+\/[^\/]+\.html/
  25332.     if(articleRegexp.test(url)) {
  25333.         return "newspaperArticle";
  25334.     } else {
  25335.         var aTags = doc.getElementsByTagName("a");
  25336.         for(var i=0; i<aTags.length; i++) {
  25337.             if(articleRegexp.test(aTags[i].href)) {
  25338.                 return "multiple";
  25339.             }
  25340.         }
  25341.     }
  25342. }',
  25343. 'function scrape(doc) {
  25344.     var namespace = doc.documentElement.namespaceURI;
  25345.     var nsResolver = namespace ? function(prefix) {
  25346.         if (prefix == ''x'') return namespace; else return null;
  25347.     } : null;
  25348.     
  25349.     var newItem = new Zotero.Item("newspaperArticle");
  25350.     newItem.publicationTitle = "The Washington Post";
  25351.     newItem.ISSN = "0740-5421";
  25352.     
  25353.     newItem.url = doc.location.href;
  25354.     var metaTags = doc.getElementsByTagName("meta");
  25355.     
  25356.     // Elena''s code to grab print version (all pages)
  25357.     snapshotURL=doc.location.href.replace(".html", "_pf.html");
  25358.     newItem.attachments.push({title:"Washington Post Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true});
  25359.  
  25360.     // grab title from doc title
  25361.     newItem.title = doc.title.replace(" - washingtonpost.com", "");
  25362.     
  25363.     var byline = doc.evaluate(''//div[@id="byline"]'', doc, nsResolver,
  25364.                             XPathResult.ANY_TYPE, null).iterateNext();    
  25365.     // grab authors from byline
  25366.     if(byline) {
  25367.         var authors = byline.textContent.substr(3).split(" and ");
  25368.         for each(var author in authors) {
  25369.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  25370.         }
  25371.     }
  25372.     
  25373.     var fonts = doc.evaluate(''//div[@id="article"]/p/font/text()'', doc, nsResolver,
  25374.                             XPathResult.ANY_TYPE, null);
  25375.     var font;
  25376.     while(font = fonts.iterateNext()) {
  25377.         var pageRe = /([^;]+);(?:[\xA0 ]+Pages?[\xA0 ]+([A-Z0-9\-]+))?/
  25378.         // grab pages and date
  25379.         Zotero.debug(Zotero.Utilities.cleanString(font.nodeValue));
  25380.         var m = pageRe.exec(font.nodeValue);
  25381.         if(m) {
  25382.             newItem.date = m[1];
  25383.             newItem.pages = m[2];
  25384.             break;
  25385.         }
  25386.     }
  25387.     
  25388.     // grab tags from meta tag
  25389.     var keywords = doc.getElementsByTagName("meta");
  25390.     if(keywords) {
  25391.         keywords = keywords.namedItem("keywords");
  25392.         if(keywords) {
  25393.             keywords = keywords.getAttribute("content");
  25394.             if(keywords) {
  25395.                 newItem.tags = keywords.split(/, ?/);
  25396.             }
  25397.         }
  25398.     }
  25399.     
  25400.     newItem.complete();
  25401. }
  25402.  
  25403. function doWeb(doc, url) {
  25404.     var articleRegexp = /http:\/\/www\.washingtonpost\.com\/wp-dyn\/content\/article\/[0-9]+\/[0-9]+\/[0-9]+\/[^\/]+\.html/
  25405.     if(articleRegexp.test(url)) {
  25406.         scrape(doc);
  25407.     } else {
  25408.         var items = Zotero.Utilities.getItemArray(doc, doc, articleRegexp);
  25409.         items = Zotero.selectItems(items);
  25410.         
  25411.         if(!items) {
  25412.             return true;
  25413.         }
  25414.         
  25415.         var urls = new Array();
  25416.         for(var i in items) {
  25417.             urls.push(i);
  25418.         }
  25419.         
  25420.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  25421.         Zotero.wait();
  25422.     }
  25423. }');
  25424.  
  25425. REPLACE INTO translators VALUES ('a07bb62a-4d2d-4d43-ba08-d9679a0122f8', '1.0.0b3.r1', '', '2008-01-09 20:00:00', 1, 100, 4, 'ABC-CLIO Serials Web', 'Simon Kornblith', 'https?://[^/]*serials\.abc-clio\.com[^/]*/active/go/ABC-Clio-Serials_v4', 
  25426. 'function detectWeb(doc, url) {
  25427.     var namespace = doc.documentElement.namespaceURI;
  25428.     var nsResolver = namespace ? function(prefix) {
  25429.         if (prefix == ''x'') return namespace; else return null;
  25430.     } : null;
  25431.     
  25432.     var result = doc.evaluate(''//table[@class="rc_main"]'', doc, nsResolver,
  25433.                  XPathResult.ANY_TYPE, null).iterateNext();
  25434.     if(result) {
  25435.         return "multiple";
  25436.     }
  25437. }',
  25438. 'function doWeb(doc, url) {
  25439.     var namespace = doc.documentElement.namespaceURI;
  25440.     var nsResolver = namespace ? function(prefix) {
  25441.         if (prefix == ''x'') return namespace; else return null;
  25442.     } : null;
  25443.     
  25444.     var availableItems = new Array();
  25445.     var availableAttachments = new Array();
  25446.         
  25447.     var elmts = doc.evaluate(''//table[@class="rc_main"]'', doc, nsResolver,
  25448.                              XPathResult.ANY_TYPE, null);
  25449.     var elmt;
  25450.     while(elmt = elmts.iterateNext()) {
  25451.         var title = doc.evaluate(''./tbody/tr/td[b/text() = "Title:"]'',
  25452.                                  elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  25453.         var checkbox = doc.evaluate(''.//input[@type = "checkbox"]'',
  25454.                                  elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();            
  25455.         if(title, checkbox) {
  25456.             checkbox = checkbox.name;
  25457.             availableItems[checkbox] = Zotero.Utilities.cleanString(title.textContent).substr(6);
  25458.             
  25459.             var links = doc.evaluate(''./tbody/tr/td[b/text() = "Fulltext: ["]/a'',
  25460.                                      elmt, nsResolver, XPathResult.ANY_TYPE, null);
  25461.             var link;
  25462.             
  25463.             var attach = new Array();
  25464.             while(link = links.iterateNext()) {
  25465.                 attach.push({url:link.href, title:Zotero.Utilities.cleanString(link.textContent)+" Full Text",
  25466.                              mimeType:"text/html"});
  25467.             }
  25468.             availableAttachments[checkbox] = attach;
  25469.         }
  25470.     }
  25471.     
  25472.     var items = Zotero.selectItems(availableItems);
  25473.     
  25474.     if(!items) {
  25475.         return true;
  25476.     }
  25477.     
  25478.     var postString = "_defaultoperation=Download+Options&research_field=&research_value=&jumpto=";
  25479.     var attachments = new Array();
  25480.     for(var i in availableItems) {
  25481.         postString += "&_checkboxname="+i+(items[i] ? "&"+i+"=1" : "");
  25482.         if(items[i]) {
  25483.             attachments.push(availableAttachments[i]);
  25484.         }
  25485.     }
  25486.     
  25487.     Zotero.Utilities.HTTP.doPost(url, postString, function(text) {
  25488.         Zotero.Utilities.HTTP.doPost(url, "_appname=serials&_defaultoperation=Download+Documents&_formname=download&download_format=citation&download_which=tagged&download_where=ris&mailto=&mailreplyto=&mailsubject=&mailmessage=",
  25489.                                       function(text) {    
  25490.             // get link
  25491.             var linkRe = /<a\s+class="button"\s+href="([^"]+)"\s+id="resource_link"/i;
  25492.             var m = linkRe.exec(text);
  25493.             if(!m) {
  25494.                 throw("regular expression failed!");
  25495.             }            
  25496.             Zotero.Utilities.HTTP.doGet(m[1], function(text) {
  25497.                 // load translator for RIS
  25498.                 var translator = Zotero.loadTranslator("import");
  25499.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  25500.                 translator.setString(text);
  25501.                 translator.setHandler("itemDone", function(obj, item) {
  25502.                     if(item.notes && item.notes[0]) {
  25503.                         item.extra = item.notes[0].note;
  25504.                         
  25505.                         delete item.notes;
  25506.                         item.notes = undefined;
  25507.                     }
  25508.                     
  25509.                     // grab uni data from thesis
  25510.                     if(item.itemType == "thesis") {
  25511.                         var re = /^(.+?) ([0-9]{4})\. ([0-9]+) pp\.(.*)$/;
  25512.                         var m = re.exec(item.extra);
  25513.                         if(m) {
  25514.                             item.publisher = m[1];
  25515.                             item.date = m[2];
  25516.                             item.pages = m[3];
  25517.                             item.extra = m[4];
  25518.                         }
  25519.                     }
  25520.                     
  25521.                     // fix periods
  25522.                     for(var i in item.creators) {
  25523.                         var nameLength = item.creators[i].firstName.length;
  25524.                         
  25525.                         if(item.creators[i].firstName[nameLength-1] == ".") {
  25526.                             item.creators[i].firstName = item.creators[i].firstName.substr(0, nameLength-1);
  25527.                         }
  25528.                     }
  25529.                     for(var i in item.tags) {
  25530.                         var tagLength = item.tags[i].length;
  25531.                         
  25532.                         if(item.tags[i][tagLength-1] == ".") {
  25533.                             item.tags[i] = item.tags[i].substr(0, tagLength-1);
  25534.                         }
  25535.                     }
  25536.                     
  25537.                     // fix title
  25538.                     item.title = Zotero.Utilities.superCleanString(item.title);
  25539.                     
  25540.                     // add attachments
  25541.                     item.attachments = attachments.shift();
  25542.                     
  25543.                     item.complete();
  25544.                 });
  25545.                 translator.translate();
  25546.                 Zotero.done();
  25547.             });
  25548.         });
  25549.     });
  25550.     
  25551.     Zotero.wait();
  25552. }');
  25553.  
  25554. REPLACE INTO translators VALUES ('fa396dd4-7d04-4f99-95e1-93d6f355441d', '1.0.0b3.r1', '', '2008-02-06 21:00:00', 1, 100, 4, 'CiteSeer', 'Simon Kornblith', '^http://(?:citeseer\.ist\.psu\.edu/|citeseer\.csail\.mit\.edu/|citeseer\.ifi\.unizh\.ch/|citeseer\.comp\.nus\.edu\.sg/)', 
  25555. 'function detectWeb(doc, url) {
  25556.     var searchRe = /http:\/\/[^\/]+\/ci?s/;
  25557.     if(searchRe.test(url)) {
  25558.         return "multiple";
  25559.     } else {
  25560.         var namespace = doc.documentElement.namespaceURI;
  25561.         var nsResolver = namespace ? function(prefix) {
  25562.             if (prefix == ''x'') return namespace; else return null;
  25563.         } : null;
  25564.         
  25565.         if(doc.evaluate(''/html/body/span[@class="m"]/pre'', doc, nsResolver,
  25566.                         XPathResult.ANY_TYPE, null).iterateNext()) {
  25567.             return "journalArticle";
  25568.         }
  25569.     }
  25570. }', 
  25571. 'function scrape(doc) {
  25572.     var namespace = doc.documentElement.namespaceURI;
  25573.     var nsResolver = namespace ? function(prefix) {
  25574.         if (prefix == ''x'') return namespace; else return null;
  25575.     } : null;
  25576.     
  25577.     // figure out what attachments to add
  25578.     var attachments = new Array();
  25579.     var results = doc.evaluate(''/html/body/span[@class="m"]/table[@class="h"]/tbody/tr/td[4]/center/font/a'',
  25580.                            doc, nsResolver, XPathResult.ANY_TYPE, null);
  25581.     var elmt;
  25582.     
  25583.     var acceptableTypes = ["PDF", "PS", "PS.gz"];
  25584.     var mimeTypes = ["application/pdf", "application/postscript", "application/gzip"];
  25585.     var resultsArray = [];
  25586.     while (elmt = results.iterateNext()) {
  25587.         resultsArray.push(elmt);
  25588.     }
  25589.     resultsArray = resultsArray.filter(function (element, index, array) {
  25590.         return (acceptableTypes.indexOf(element.textContent.toString()) != -1);
  25591.     });
  25592.     resultsArray = resultsArray.sort(function (a,b) {
  25593.         return (acceptableTypes.indexOf(a.textContent.toString()) -
  25594.             acceptableTypes.indexOf(b.textContent.toString()));
  25595.     });
  25596.     if (resultsArray.length > 0) {
  25597.         var elmt = resultsArray[0];
  25598.         var kind = elmt.textContent.toString();
  25599.         var index = acceptableTypes.indexOf(kind);
  25600.                var attachment = {url:elmt.href, mimeType:mimeTypes[index],
  25601.                          title:"CiteSeer Full Text "+kind};
  25602.         attachments.push(attachment);
  25603.     }
  25604.     
  25605.     var bibtex = doc.evaluate(''/html/body/span[@class="m"]/pre/text()'', doc, nsResolver,
  25606.                         XPathResult.ANY_TYPE, null).iterateNext();
  25607.     if(bibtex) {
  25608.         var translator = Zotero.loadTranslator("import");
  25609.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  25610.         translator.setString(bibtex.nodeValue.toString());
  25611.         translator.setHandler("itemDone", function(obj, item) {
  25612.             if(item.url) {    // add http to url
  25613.                 item.url = "http://"+item.url;
  25614.             }
  25615.             item.attachments = attachments;
  25616.             
  25617.             item.complete();
  25618.         });
  25619.         translator.translate();
  25620.     } else {
  25621.         throw "No BibTeX found!";
  25622.     }
  25623. }
  25624.  
  25625. function doWeb(doc, url) {
  25626.     var searchRe = /http:\/\/([^\/]+)\/ci?s/;
  25627.     var m = searchRe.exec(doc.location.href);
  25628.     if(m) {
  25629.         var namespace = doc.documentElement.namespaceURI;
  25630.         var nsResolver = namespace ? function(prefix) {
  25631.             if (prefix == ''x'') return namespace; else return null;
  25632.         } : null;
  25633.         
  25634.         var items = Zotero.Utilities.getItemArray(doc, doc, "^http://"+m[1]+"/[^/]+.html");
  25635.         items = Zotero.selectItems(items);
  25636.             
  25637.         if(!items) {
  25638.             return true;
  25639.         }
  25640.         
  25641.         var urls = new Array();
  25642.         for(var i in items) {
  25643.             urls.push(i);
  25644.         }
  25645.         
  25646.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  25647.         Zotero.wait();
  25648.     } else {
  25649.         scrape(doc);
  25650.     }
  25651. }');
  25652.  
  25653. REPLACE INTO translators VALUES ('8917b41c-8527-4ee7-b2dd-bcbc3fa5eabd', '1.0.0b4.r5', '', '2008-02-01 19:30:00', '1', '100', '4', 'CiteULike', 'Sean Takats', 'https?://(?:www\.)?citeulike.org(?:.*/tag/[^/]*$|/search/|/journal/|/group/[0-9]+/library$|/\?page=[0-9]+$|/.*article/[0-9]+$|/$)', 
  25654. 'function detectWeb(doc, url){
  25655.     var articleRe = /\/article\/[0-9]+$/;
  25656.     var m = url.match(articleRe);
  25657.     var newUris = new Array();
  25658.     
  25659.     if (m){
  25660.         return "journalArticle";
  25661.     } else {
  25662.         return "multiple";
  25663.     }
  25664. }', 
  25665. 'function doWeb(doc, url){
  25666.     var articleRe = /\/article\/[0-9]+$/;
  25667.     var m = url.match(articleRe);
  25668.     var newUris = new Array();
  25669.     
  25670.     if (m){
  25671.         newUris.push(url.replace(/citeulike\.org\//, "citeulike.org/endnote/"));
  25672.     } else {
  25673.         var namespace = doc.documentElement.namespaceURI;
  25674.         var nsResolver = namespace ? function(prefix) {
  25675.             if (prefix == ''x'') return namespace; else return null;
  25676.         } : null;
  25677.         var elmt;
  25678.         var elmts = doc.evaluate(''//a[@class="title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  25679.         var items = new Object();        
  25680.         while(elmt = elmts.iterateNext()) {
  25681.             items[elmt.href] = Zotero.Utilities.trimInternal(elmt.textContent);
  25682.         } 
  25683.         items = Zotero.selectItems(items);
  25684.         if(!items) return true;
  25685.         for(var uri in items) {
  25686.             newUris.push(uri.replace(/citeulike\.org\//, "citeulike.org/endnote/"));
  25687.         }
  25688.     }
  25689.     Zotero.Utilities.HTTP.doGet(newUris, function(text) {
  25690.         var translator = Zotero.loadTranslator("import");
  25691.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  25692.         translator.setString(text);
  25693.         translator.translate();
  25694.         Zotero.done();
  25695.     });
  25696.     Zotero.wait();
  25697. }');
  25698.  
  25699.  
  25700. REPLACE INTO translators VALUES ('ecddda2e-4fc6-4aea-9f17-ef3b56d7377a', '1.0.0b3.r1', '', '2009-01-28 18:10:00', 1, 100, 4, 'arXiv.org', 'Sean Takats and Michael Berkowitz', 'http://(?:([^\.]+\.))?(?:(arxiv\.org|xxx.lanl.gov)/(?:find/\w|list/\w|abs/)|eprintweb.org/S/(?:search|archive|article)(?!.*refs$)(?!.*cited$))',
  25701. 'function detectWeb(doc, url) {
  25702.     var searchRe = /^http:\/\/(?:([^\.]+\.))?(?:(arxiv\.org|xxx\.lanl\.gov)\/(?:find|list)|eprintweb.org\/S\/(?:archive|search$))/;
  25703.     if(searchRe.test(url)) {
  25704.         return "multiple";
  25705.     } else {
  25706.         return "journalArticle";
  25707.     }
  25708. }',
  25709. 'function getPDF(articleID) {
  25710.     return {url:"http://www.arxiv.org/pdf/" + articleID + ".pdf",
  25711.             mimeType:"application/pdf", title:articleID + " PDF"};
  25712. }
  25713.  
  25714. function doWeb(doc, url) {
  25715.     var eprintMultRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:search|archive)/;
  25716.     var eprintMultM = eprintMultRe.exec(url);
  25717.     
  25718.     var eprintSingRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:article|search\/[0-9]+\/A[0-9]+)/;
  25719.     var eprintSingM = eprintSingRe.exec(url);
  25720.  
  25721.     if (eprintMultM) {
  25722.         var elmtsXPath = ''//table/tbody/tr/td[@class="txt"]/a[text()="Abstract"]/../b'';
  25723.         var titlesXPath = ''//table/tbody/tr/td[@class="lti"]'';
  25724.         var titleNode = ''./text()'';
  25725.     } else {
  25726.         var elmtsXPath = ''//div[@id="dlpage"]/dl/dt/span[@class="list-identifier"]/a[1]'';
  25727.         var titlesXPath = ''//div[@id="dlpage"]/dl/dd/div[@class="meta"]/div[@class="list-title"]'';
  25728.     }
  25729.  
  25730.     var namespace = doc.documentElement.namespaceURI;
  25731.     var nsResolver = namespace ? function(prefix) {
  25732.         if (prefix == ''x'') return namespace; else return null;
  25733.     } : null;
  25734.  
  25735.     var elmts = doc.evaluate(elmtsXPath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  25736.     var titles = doc.evaluate(titlesXPath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  25737.  
  25738.     var newURIs = new Array();
  25739.     var elmt = elmts.iterateNext();
  25740.     var title = titles.iterateNext();
  25741.     if (elmt && titles) {
  25742.         var availableItems = new Array();
  25743.         var arXivCats = new Array();
  25744.         var arXivIDs = new Array();
  25745.         var i=0;
  25746.         if (eprintMultM){
  25747.             do {
  25748.                 var newID = doc.evaluate(''./text()'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  25749.                 newID = newID.replace(/arXiv:/, "");
  25750.                 newID = newID.replace(/\//g, "%2F");
  25751.                 newID = newID.replace(/v\d*/, ""); //remove version number  
  25752.                 availableItems[i] = doc.evaluate(titleNode, title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; 
  25753.                 arXivIDs[i] = newID;
  25754.                 i++;
  25755.             } while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext()));
  25756.         }
  25757.         else{
  25758.             do {
  25759.                 var newID= elmt.textContent;
  25760.                 newID = newID.replace(/arXiv:/, "");
  25761.                 newID = newID.replace(/\//g, "%2F");
  25762.                 newID = newID.replace(/v\d*/, ""); //remove version number 
  25763.                 availableItems[i] = Zotero.Utilities.cleanString(title.textContent.replace(/^\s*Title:\s+/, "")); 
  25764.                 arXivIDs[i] = newID;
  25765.                 i++;
  25766.             } while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext()));
  25767.         }
  25768.         var items = Zotero.selectItems(availableItems);
  25769.         if(!items) {
  25770.             return true;
  25771.         }
  25772.         for(var i in items) {
  25773.             newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivIDs[i] + "&metadataPrefix=oai_dc");
  25774.  
  25775.         }
  25776.     }
  25777.     else {
  25778.         if (eprintSingM){
  25779.             var titleID = doc.evaluate(''//td[@class="ti"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  25780.             var arXivID = doc.evaluate(''//table/tbody/tr[4]/td/table/tbody/tr/td[1]/table/tbody/tr[1]/td[@class="txt"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  25781.             arXivID = arXivID.substring(0, arXivID.indexOf(" "));
  25782.             arXivID = arXivID.replace(/arXiv:/, "");
  25783.             arXivID = arXivID.replace(/\//g, "%2F");
  25784.         } else {
  25785.             var arXivID = doc.evaluate(''//title'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  25786.             var titleRe = /\[([^\]]*)]/;
  25787.             var m = titleRe.exec(arXivID);
  25788.             arXivID = m[1];
  25789.             arXivID = arXivID.replace(/\//g, "%2F"); 
  25790.         }
  25791.         arXivID = arXivID.replace(/v\d*/, ""); //remove version number
  25792.         Zotero.debug("ID= "+ arXivID);
  25793.         newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivID + "&metadataPrefix=oai_dc");
  25794.  
  25795.     }
  25796.  
  25797.     Zotero.Utilities.HTTP.doGet(newURIs, function(text) {
  25798.         var newItem = new Zotero.Item("journalArticle");
  25799.         //    remove header
  25800.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  25801.         //    fix non-compliant XML tags (colons)
  25802.         text = text.replace(/<dc:/g, "<dc_").replace(/<\/dc:/g, "</dc_");
  25803.         text = text.replace(/<oai_dc:dc/g, "<oai_dc_dc").replace(/<\/oai_dc:dc/g, "</oai_dc_dc");
  25804.         text = text.replace(/<OAI-PMH[^>]*>/, "").replace(/<\/OAI-PMH[^>]*>/, "");
  25805.         text = "<zotero>" + text + "</zotero>";
  25806.         var xml = new XML(text);
  25807.         var title;
  25808.         var citation = xml.GetRecord.record.metadata.oai_dc_dc;
  25809.         var test = xml..responseDate.text().toString();
  25810.  
  25811.         if (citation.dc_title.length()){
  25812.             title = Zotero.Utilities.cleanString(citation.dc_title.text().toString());
  25813.             newItem.title = title;
  25814.         }
  25815.         Zotero.debug("article title: " + title);
  25816.         var type = "";
  25817.         if(citation.dc_creator.length()) {
  25818.         var authors = citation.dc_creator;
  25819.             for(var j=0; j<authors.length(); j++) {
  25820.                 Zotero.debug("author: " + authors[j]);
  25821.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true));
  25822.             }
  25823.         }
  25824.         if (citation.dc_date.length()) {
  25825.             var dates = citation.dc_date;
  25826.             newItem.date = Zotero.Utilities.cleanString(dates[0].text().toString());
  25827.         }
  25828.         if (citation.dc_description.length()) {
  25829.             var descriptions = citation.dc_description;
  25830.             for (var j=0; j<descriptions.length(); j++) {
  25831.                 var noteStr = Zotero.Utilities.cleanString(descriptions[j].text().toString());
  25832.                 newItem.notes.push({note:noteStr});
  25833.             }
  25834.         }
  25835.         if (citation.dc_subject.length()) {
  25836.             var subjects = citation.dc_subject;
  25837.             for (var j=0; j<subjects.length(); j++) { 
  25838.                 var subjectValue = Zotero.Utilities.cleanString(subjects[j].text().toString());
  25839.                 newItem.tags.push(subjectValue);
  25840.             }
  25841.         }
  25842.         if (citation.dc_identifier.length()) {
  25843.             var identifiers = citation.dc_identifier;
  25844.             for (var j=0; j<identifiers.length(); j++) {
  25845.                 var identifier = Zotero.Utilities.cleanString(identifiers[j].text().toString());
  25846.                 if (identifier.substr(0, 4) == "doi:") {
  25847.                     newItem.DOI = identifier;
  25848.                 }
  25849.                 else if (identifier.substr(0, 7) == "http://") {
  25850.                     newItem.url = identifier;
  25851.                 }
  25852.                 else {
  25853.                     newItem.extra = identifier;
  25854.                 }
  25855.             }
  25856.         }
  25857.         var articleID = "";
  25858.         if (xml.GetRecord.record.header.identifier.length()) {
  25859.             articleID = xml.GetRecord.record.header.identifier.text().toString();
  25860.             articleID = articleID.substr(14);
  25861.             newItem.publicationTitle = articleID;
  25862.         }
  25863. //        TODO add "arXiv.org" to bib data?
  25864.         newItem.attachments.push({url:newItem.url, title:"arXiv.org Snapshot", mimeType:"text/html"});
  25865.         newItem.attachments.push(getPDF(articleID));
  25866.         if (newItem.notes[0][''note'']) {
  25867.             newItem.abstractNote = newItem.notes[0][''note''];
  25868.             newItem.notes = new Array();
  25869.         }
  25870.         newItem.complete();
  25871.     }, function() {Zotero.done();}, null);
  25872.     Zotero.wait();
  25873. }');
  25874.  
  25875.  
  25876. REPLACE INTO translators VALUES ('232903bc-7307-4058-bb1a-27cfe3e4e655', '1.0.0b3.r1', '', '2007-04-23 17:00:00', '0', '100', '4', 'SPIRES', 'Sean Takats', '^http://www.slac.stanford.edu/spires/find/hep/', 
  25877. 'function detectWeb(doc, url) {
  25878.     var namespace = doc.documentElement.namespaceURI;
  25879.     var nsResolver = namespace ? function(prefix) {
  25880.         if (prefix == ''x'') return namespace; else return null;
  25881.     } : null;
  25882.         
  25883.     var citations = doc.evaluate(''//dl/dd/a[text()="BibTeX"]'', doc, nsResolver,
  25884.             XPathResult.ANY_TYPE, null);
  25885.     var citation = citations.iterateNext();
  25886.     var titles = doc.evaluate(''//p/b[1]'', doc, nsResolver,
  25887.             XPathResult.ANY_TYPE, null);
  25888.     var title = titles.iterateNext();
  25889.     if(citation && title) {
  25890.         // search page
  25891.         return "multiple";
  25892.     }
  25893. }', 
  25894. 'function doWeb(doc, url) {
  25895.     var namespace = doc.documentElement.namespaceURI;
  25896.     var nsResolver = namespace ? function(prefix) {
  25897.         if (prefix == ''x'') return namespace; else return null;
  25898.     } : null;
  25899.         
  25900.     var citations = doc.evaluate(''//dl/dd/a[text()="BibTeX"]'', doc, nsResolver,
  25901.             XPathResult.ANY_TYPE, null);
  25902.     var citation = citations.iterateNext();
  25903. //    var titles = doc.evaluate(''//p/b[1]'', doc, nsResolver,
  25904. //            XPathResult.ANY_TYPE, null);
  25905.     var titles = doc.evaluate(''//p[b[1]]'', doc, nsResolver,
  25906.             XPathResult.ANY_TYPE, null);
  25907.     var title = titles.iterateNext();
  25908.     if(citation && title) {
  25909.         // search page
  25910.         var items = new Object();        
  25911.         do {
  25912.             items[citation.href] = Zotero.Utilities.cleanString(title.textContent);
  25913.         } while((citation=citations.iterateNext()) && (title=titles.iterateNext()))
  25914.         
  25915.         items = Zotero.selectItems(items);
  25916.         if(!items) return true;
  25917.         
  25918.         var newUris = new Array();
  25919.         for(var id in items) {
  25920.             newUris.push(id);
  25921.         }
  25922.     } else {
  25923.         //single result page?
  25924.     }
  25925.     
  25926.     Zotero.Utilities.HTTP.doGet(newUris, function(text) {
  25927.         var m = text.match(/<pre>(?:.|[\r\n])*?<\/pre>/g);
  25928.         var bibTeXString = "";
  25929.         for each(var citation in m) {
  25930.             // kill pre tags
  25931.             citation = citation.substring(5, citation.length-6);
  25932.             bibTeXString += citation;
  25933.         }
  25934.         
  25935.         // import using BibTeX
  25936.         var translator = Zotero.loadTranslator("import");
  25937.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  25938.         translator.setString(bibTeXString);
  25939.         translator.setHandler("itemDone", function(obj, item) {            
  25940.             item.complete();
  25941.         });
  25942.         translator.translate();
  25943.         
  25944.         Zotero.done();
  25945.     });
  25946.     Zotero.wait();
  25947. }');
  25948.  
  25949.  
  25950. REPLACE INTO translators VALUES ('fe728bc9-595a-4f03-98fc-766f1d8d0936', '1.0.0b4.r5', '', '2009-01-10 04:45:00', 1, 100, 4, 'Wiley InterScience', 'Sean Takats and Michael Berkowitz', 'https?:\/\/(?:www3\.|www\.)?interscience\.wiley\.com[^\/]*\/(?:search\/|(cgi-bin|journal)\/[0-9]+\/abstract|journal)',
  25951. 'function detectWeb(doc, url){
  25952.     var namespace = doc.documentElement.namespaceURI;
  25953.     var nsResolver = namespace ? function(prefix) {
  25954.         if (prefix == ''x'') return namespace; else return null;
  25955.     } : null;
  25956.         
  25957.     var xpath = ''//input[@name="ID"][@type="checkbox"]'';
  25958.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  25959.         return "multiple";
  25960.     }
  25961.     if (url.match(/journal\/\d+\/(issue|home)$/)) {
  25962.         return "multiple";
  25963.     }
  25964.     var m = url.match(/https?:\/\/[^\/]*\/(cgi-bin|journal)(\/(abstract|summary))?\/[0-9]+\/abstract/);
  25965.     if (m){
  25966.         return "journalArticle";
  25967.     }
  25968. }',
  25969. 'function doWeb(doc, url){
  25970.     var namespace = doc.documentElement.namespaceURI;
  25971.     var nsResolver = namespace ? function(prefix) {
  25972.         if (prefix == ''x'') return namespace; else return null;
  25973.     } : null;
  25974.     var host = ''http://'' + doc.location.host + "/";
  25975.     Zotero.debug(host);
  25976.     var m = url.match(/https?:\/\/[^\/]*\/(journal|cgi-bin\/summary)\/([0-9]+)\/(abstract)?/);
  25977.     var ids = new Array();
  25978.     if(detectWeb(doc, url) == "multiple") {  //search
  25979.         var id;
  25980.         var title;
  25981.         var availableItems = new Array();
  25982.         var xpath = ''//tr[td/input[@name="ID"][@type="checkbox"]]'';
  25983.         if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  25984.             elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  25985.             var elmt = elmts.iterateNext();
  25986.             do {
  25987.                 title = doc.evaluate(''./td/strong'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  25988.                 id = doc.evaluate(''./td/input[@name="ID"][@type="checkbox"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  25989.                 availableItems[id] = title;
  25990.             } while (elmt = elmts.iterateNext())
  25991.         } else {
  25992.             var xpath = ''//div[@id="contentCell"]/div[*/a]'';
  25993.             var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  25994.             var elmt = elmts.iterateNext();
  25995.             do {
  25996.                 title = Zotero.Utilities.trimInternal(doc.evaluate(''.//strong'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  25997.                 id = doc.evaluate(''.//a[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.match(/\/([\d]+)\/abstract/)[1];
  25998.                 availableItems[id] = title;
  25999.             } while (elmt = elmts.iterateNext())
  26000.         }
  26001.         var items = Zotero.selectItems(availableItems);
  26002.         if(!items) {
  26003.             return true;
  26004.         }
  26005.         for(var id in items) {
  26006.             ids.push(id);
  26007.         }
  26008.         
  26009.     } else if (m){ //single article
  26010.         ids.push(m[2]);
  26011.     }
  26012.     
  26013.     var setupSets = [];
  26014.     for each (id in ids) {
  26015.         var uri = host + ''tools/citex'';
  26016.         var poststring = "clienttype=1&subtype=1&mode=1&version=1&id=" + id;
  26017.         setupSets.push({ id: id, uri: uri, poststring: poststring });
  26018.     }
  26019.     
  26020.     var setupCallback = function () {
  26021.         if (setupSets.length) {
  26022.             var set = setupSets.shift();
  26023.             Zotero.Utilities.HTTP.doPost(set.uri, set.poststring, function () {
  26024.                 processCallback(set.id);
  26025.             });
  26026.         }
  26027.         else {
  26028.             Zotero.done();
  26029.         }
  26030.     }
  26031.     
  26032.     var processCallback = function (id) {
  26033.         var uri = host+"tools/CitEx";
  26034.         var poststring = "mode=2&format=3&type=2&file=3&exportCitation.x=16&exportCitation.y=10&exportCitation=submit";
  26035.         Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  26036.             var m = text.match(/%A\s(.*)/);  //following lines fix Wiley''s incorrect %A tag (should be separate tags for each author)
  26037.             if (m){
  26038.                 var newauthors ="";
  26039.                 var authors = m[1].split(",")
  26040.                 for each (var author in authors){
  26041.                     if (author != ""){
  26042.                         newauthors = newauthors + "%A "+Zotero.Utilities.unescapeHTML(Zotero.Utilities.trimInternal(author))+"\n";
  26043.                     }
  26044.                 }
  26045.                 text = text.replace(/%A\s.*\n/, newauthors);
  26046.             }
  26047.             var translator = Zotero.loadTranslator("import");
  26048.             translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); //EndNote/Refer/BibIX
  26049.             translator.setString(text);
  26050.             translator.setHandler("itemDone", function(obj, item) {
  26051.                 var pdfurl = ''http://download.interscience.wiley.com/cgi-bin/fulltext?ID='' + id + ''&PLACEBO=IE.pdf&mode=pdf'';
  26052.                 item.attachments.push({url:pdfurl, title:"Wiley Interscience PDF", mimeType:"application/pdf"});
  26053.                 item.DOI = item.url.match(/\.org\/(.*)$/)[1];
  26054.                 item.complete();
  26055.             });
  26056.             translator.translate();
  26057.             
  26058.             setupCallback();
  26059.         });
  26060.     }
  26061.     
  26062.     setupCallback();
  26063.     Zotero.wait();
  26064. }');
  26065.  
  26066.  
  26067. REPLACE INTO translators VALUES ('b6d0a7a-d076-48ae-b2f0-b6de28b194e', '1.0.0b3.r1', '', '2008-12-15 05:30:00', 1, 100, 4, 'ScienceDirect', 'Michael Berkowitz', 'https?://[^/]*science-?direct\.com[^/]*/science(\/article)?(\?(?:.+\&|)ob=(?:ArticleURL|ArticleListURL|PublicationURL))?',
  26068. 'function detectWeb(doc, url) {
  26069.     if ((url.indexOf("_ob=DownloadURL") != -1) || doc.title == "ScienceDirect Login") {
  26070.         return false;
  26071.     }
  26072.     if((!url.match("pdf") && url.indexOf("_ob=ArticleURL") == -1 && url.indexOf("/article/") == -1) || url.indexOf("/journal/") != -1) {
  26073.         return "multiple";
  26074.     } else if (!url.match("pdf")) {
  26075.         return "journalArticle";
  26076.     }
  26077. }',
  26078. 'function doWeb(doc, url) {
  26079.     var namespace = doc.documentElement.namespaceURI;
  26080.     var nsResolver = namespace ? function(prefix) {
  26081.         if (prefix == ''x'') return namespace; else return null;
  26082.     } : null;
  26083.  
  26084.         if (!doc.evaluate(''//div[@title = "Advertisement."]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  26085.         var articles = new Array();
  26086.         if(detectWeb(doc, url) == "multiple") {
  26087.             //search page
  26088.             var items = new Object();
  26089.             var xpath;
  26090.             if (url.indexOf("_ob=PublicationURL") != -1) {
  26091.                 // not sure if this case still arises. may need to be fixed at some point
  26092.                 xpath = ''//table[@class="txt"]/tbody/tr/td[2]'';
  26093.             } else {
  26094.                 xpath = ''//div[@class="font3"][@id="bodyMainResults"]/table/tbody/tr/td[2]/a'';
  26095.             }
  26096.             var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  26097.             var next_row;
  26098.             while (next_row = rows.iterateNext()) {
  26099.                 var title = next_row.textContent;
  26100.                 var link = next_row.href;
  26101.                 if (!title.match(/PDF \(/) && !title.match(/Related Articles/)) items[link] = title;
  26102.             }
  26103.             items = Zotero.selectItems(items);
  26104.             for (var i in items) {
  26105.                 articles.push(i);
  26106.             }
  26107.         } else {
  26108.             articles = [url];
  26109.         }
  26110.         Zotero.Utilities.processDocuments(articles, function(newDoc) {
  26111.             var doi = newDoc.evaluate(''//div[@class="articleHeaderInner"][@id="articleHeader"]/a[contains(text(), "doi")]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(4);
  26112.             
  26113.             var tempPDF = newDoc.evaluate(''//a[@class="noul" and div/div[contains(text(), "PDF")]]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  26114.             if (!tempPDF) { // PDF xpath failed, lets try another
  26115.                 tempPDF = newDoc.evaluate(''//a[@class="noul" and contains(text(), "PDF")]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  26116.                 if (!tempPDF) { // second PDF xpath failed set PDF to null to avoid item.attachments
  26117.                     var PDF = null;
  26118.                 } else {
  26119.                     var PDF = tempPDF.href; // second xpath succeeded, use that link
  26120.                 }
  26121.             } else {
  26122.                 var PDF = tempPDF.href; // first xpath succeeded, use that link
  26123.             }
  26124.             
  26125.             var url = newDoc.location.href;
  26126.             var get = newDoc.evaluate(''//a[img[contains(@src, "exportarticle_a.gif")]]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  26127.             // if the PDF is available make it an attachment otherwise only use snapshot.
  26128.             if (PDF) {
  26129.                 var attachments = [
  26130.                     {url:url, title:"ScienceDirect Snapshot", mimeType:"text/html"},
  26131.                     {url:PDF, title:"ScienceDirect Full Text PDF", mimeType:"application/pdf"} // Sometimes PDF is null...I hope that is ok
  26132.                 ];
  26133.             } else {
  26134.                 var attachments = [
  26135.                     {url:url, title:"ScienceDirect Snapshot", mimeType:"text/html"},
  26136.                 ];
  26137.             }
  26138.             Zotero.Utilities.HTTP.doGet(get, function(text) {
  26139.                 var md5 = text.match(/<input type=hidden name=md5 value=([^>]+)>/)[1];
  26140.                 var acct = text.match(/<input type=hidden name=_acct value=([^>]+)>/)[1];
  26141.                 var userid = text.match(/<input type=hidden name=_userid value=([^>]+)>/)[1];
  26142.                 var uoikey = text.match(/<input type=hidden name=_uoikey value=([^>]+)>/)[1];
  26143.                 if (text.match(/<input type=hidden name=_ArticleListID value=([^>]+)>/)) {
  26144.                     var alid = text.match(/<input type=hidden name=_ArticleListID value=([^>]+)>/)[1];
  26145.                 }
  26146.                 if (alid) {
  26147.                     var docID = "_ArticleListID=" + alid + "&_uoikey=" + uoikey;
  26148.                 } else {
  26149.                     var docID = "_uoikey=" + uoikey;
  26150.                 }
  26151.                 var post = "_ob=DownloadURL&_method=finish&_acct=" + acct + "&_userid=" + userid + "&_docType=FLA&" + docID + "&md5=" + md5 + "&count=1&JAVASCRIPT_ON=Y&format=cite-abs&citation-type=RIS&Export=Export&x=26&y=17";
  26152.                 var baseurl = url.match(/https?:\/\/[^/]+\//)[0];
  26153.                 Zotero.Utilities.HTTP.doPost(baseurl + ''science'', post, function(text) { 
  26154.                     var translator = Zotero.loadTranslator("import");
  26155.                     translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  26156.                     translator.setString(text);
  26157.                     translator.setHandler("itemDone", function(obj, item) {
  26158.                         item.attachments = attachments;
  26159.                         
  26160.                         if(item.notes[0]) {
  26161.                             item.abstractNote = item.notes[0].note;
  26162.                             item.notes = new Array();
  26163.                         }
  26164.                         if (doi) {
  26165.                             item.DOI = doi;
  26166.                         }
  26167.                         item.complete();
  26168.                     });
  26169.                     translator.translate();
  26170.                 }, false, ''windows-1252'');
  26171.             });
  26172.         }, function() {Zotero.done;});
  26173.     } else {
  26174.         var articles = new Array();
  26175.         if (detectWeb(doc, url) == "multiple") {
  26176.             var items = new Object();
  26177.             if (url.indexOf("_ob=PublicationURL") != -1) {
  26178.                 xpath = ''//table[@class="txt"]/tbody/tr[1]/td[2]'';
  26179.                 // not sure whether this case still exists
  26180.             } else {
  26181.                 xpath = ''//div[@class="font3"][@id="bodyMainResults"]/table/tbody/tr/td[2]/a'';
  26182.             }
  26183.             var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  26184.             var next_row;
  26185.             while (next_row = rows.iterateNext()) {
  26186.                 var title = next_row.textContent;
  26187.                 var link = next_row.href;
  26188.                 items[link] = title;
  26189.             }
  26190.             items = Zotero.selectItems(items);
  26191.             for (var i in items) {
  26192.                 articles.push(i);
  26193.             }
  26194.         } else {
  26195.             articles = [url];
  26196.         }
  26197.         Zotero.Utilities.processDocuments(articles, function(doc2) {
  26198.             var item = new Zotero.Item("journalArticle");
  26199.             item.repository = "ScienceDirect";
  26200.             item.url = doc2.location.href;
  26201.             var title = doc2.title.match(/^[^-]+\-([^:]+):(.*)$/);
  26202.             item.title = Zotero.Utilities.trimInternal(title[2]);
  26203.             item.publicationTitle = Zotero.Utilities.trimInternal(title[1]);
  26204.             voliss = doc2.evaluate(''//div[@class="pageText"][@id="sdBody"]/table/tbody/tr/td[1]'', doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  26205.             if (voliss.match(/Volume\s+\d+/)) item.volume = voliss.match(/Volume\s+(\d+)/)[1];
  26206.             if (voliss.match(/Issues?\s+[^,]+/)) item.issue = voliss.match(/Issues?\s+([^,]+)/)[1];
  26207.             if (voliss.match(/(J|F|M|A|S|O|N|D)\w+\s+\d{4}/)) item.date = voliss.match(/(J|F|M|A|S|O|N|D)\w+\s+\d{4}/)[0];
  26208.             if (voliss.match(/Pages?\s+[^,^\s]+/)) item.pages = voliss.match(/Pages?\s+([^,^\s]+)/)[1];
  26209.             item.DOI = doc2.evaluate(''//div[@class="articleHeaderInner"][@id="articleHeader"]/a[contains(text(), "doi")]'', doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(4);
  26210.             var abspath = ''//div[@class="articleHeaderInner"][@id="articleHeader"]/div[@class="articleText"]/p'';
  26211.             var absx = doc2.evaluate(abspath, doc2, nsResolver, XPathResult.ANY_TYPE, null);
  26212.             var ab;
  26213.             item.abstractNote = ""
  26214.             while (ab = absx.iterateNext()) {
  26215.                 item.abstractNote += Zotero.Utilities.trimInternal(ab.textContent) + " ";
  26216.             }
  26217.             if (item.abstractNote.substr(0, 7) == "Summary") {
  26218.                 item.abstractNote = item.abstractNote.substr(9);
  26219.             }
  26220.             var tagpath = ''//div[@class="articleText"]/p[strong[starts-with(text(), "Keywords:")]]'';
  26221.             if (doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  26222.                 if (doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(":")[1]) {
  26223.                     var tags = doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(":")[1].split(";");
  26224.                     for (var i in tags) {
  26225.                         item.tags.push(Zotero.Utilities.trimInternal(tags[i]));
  26226.                     }
  26227.                 }
  26228.             }
  26229.             item.attachments.push({url:doc2.location.href, title:"ScienceDirect Snapshot", mimeType:"text/html"});
  26230.             Zotero.Utilities.HTTP.doGet(item.url, function(text) {
  26231.                 var aus = text.match(/<strong>\s+<p>.*<\/strong>/)[0].replace(/<sup>/g, "$").replace(/<\/sup>/g, "$");
  26232.                 aus = aus.replace(/\$[^$]*\$/g, "");
  26233.                 aus = aus.replace(/<a[^>]*>/g, "$").replace(/<\/a[^>]*>/g, "$");
  26234.                 aus = aus.replace(/\$[^$]*\$/g, "");
  26235.                 aus = Zotero.Utilities.cleanTags(aus);
  26236.                 aus = aus.split(/(,|and)/);
  26237.                 for (var a in aus) {
  26238.                     if (aus[a] != "," && aus[a] != "and" && aus[a].match(/\w+/)) {
  26239.                         item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aus[a]), "author"));
  26240.                     }
  26241.                 }
  26242.                 item.complete();
  26243.             });
  26244.         }, function() {Zotero.done;});
  26245.     }
  26246.     Zotero.wait();
  26247. }');
  26248.  
  26249.  
  26250. REPLACE INTO translators VALUES ('19643c25-a4b2-480d-91b7-4e0b761fb6ad', '1.0.0b3.r1', '', '2007-03-16 03:00:00', '1', '100', '4', 'ScientificCommons', 'Sean Takats', '^http://(?:en|de|www)\.scientificcommons\.org', 
  26251. 'function detectWeb(doc, url) {
  26252.     var articleRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/([0-9]+)/;
  26253.     var m = articleRe.exec(url);
  26254.  
  26255.     if(m) {
  26256.         return "journalArticle";
  26257.     } else {
  26258.         var frontRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/$/;
  26259.         if(frontRe.test(url)) return "multiple";
  26260.         
  26261.         var namespace = doc.documentElement.namespaceURI;
  26262.         var nsResolver = namespace ? function(prefix) {
  26263.             if (prefix == ''x'') return namespace; else return null;
  26264.             } : null;
  26265.         var listElt = doc.evaluate(''//div[@id="content_search_details"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  26266.         if (listElt) return "multiple";
  26267.     }
  26268.     return false;
  26269. }', 
  26270. 'function doWeb(doc, url) {
  26271.     var namespace = doc.documentElement.namespaceURI;
  26272.     var nsResolver = namespace ? function(prefix) {
  26273.         if (prefix == ''x'') return namespace; else return null;
  26274.         } : null;
  26275.  
  26276.     var hostRe = new RegExp("^(http://[^/]+)/");
  26277.     var m = hostRe.exec(url);
  26278.     var host = m[1];
  26279.  
  26280.     var articleRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/([0-9]+)/;
  26281.     m = articleRe.exec(url);
  26282.     var uris = new Array();
  26283.  
  26284.     if(m) {
  26285.         var idElt = doc.evaluate(''//div[@id="publication_id"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  26286.         if  (idElt) {
  26287.             uris.push(host + "/export/ris/" + idElt.textContent);
  26288.         } else {
  26289.             return false;
  26290.         }
  26291.     } else {
  26292.         var items = new Array();
  26293.         var listElts = doc.evaluate(''//div[@class="content_element"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  26294.         var id;
  26295.         var link;
  26296.         var title;
  26297.         while (listElt = listElts.iterateNext()) {
  26298.             id = doc.evaluate(''./@id'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  26299.             link = host + "/export/ris/" + id;
  26300.             title = doc.evaluate(''.//p[@class="title"]'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  26301.             items[link] = Zotero.Utilities.cleanString(title);
  26302.         } 
  26303.  
  26304.         items = Zotero.selectItems(items);
  26305.         if(!items) return true;
  26306.  
  26307.         for(var uri in items) {
  26308.             uris.push(uri);
  26309.         }
  26310.     }
  26311.  
  26312.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  26313.     // load translator for RIS
  26314.         var translator = Zotero.loadTranslator("import");
  26315.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  26316.         translator.setString(text);
  26317.         translator.setHandler("itemDone", function(obj, item) {
  26318.             // add attachment support?
  26319.             item.complete();
  26320.         });
  26321.         translator.translate();
  26322.         Zotero.done();
  26323.     });
  26324.     Zotero.wait();
  26325. }');
  26326.  
  26327. REPLACE INTO translators VALUES ('d75381ee-7d8d-4a3b-a595-b9190a06f43f', '1.0.0b3.r1', '', '2008-09-02 13:40:00', '0', '100', '4', 'Scitation', 'Eugeniy Mikhailov', '^https?://(?:www\.)?scitation.aip.org', 
  26328. 'function detectWeb(doc, url) {
  26329.     var namespace = doc.documentElement.namespaceURI;
  26330.     var nsResolver = namespace ? function(prefix) {
  26331.         if (prefix == ''x'') return namespace; else return null;
  26332.     } : null;
  26333.  
  26334.     var multids = doc.evaluate(''//tr/td/input[@type="checkbox" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  26335.     var singid = doc.evaluate(''//input[@type="hidden" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  26336.  
  26337.     if (multids.iterateNext()){
  26338.         return "multiple";
  26339.     } else if (singid.iterateNext()){
  26340.         return "journalArticle";
  26341.     }
  26342. }', 
  26343. 'function doWeb(doc, url) {
  26344.     var namespace = doc.documentElement.namespaceURI;
  26345.     var nsResolver = namespace ? function(prefix) {
  26346.         if (prefix == ''x'') return namespace; else return null;
  26347.     } : null;
  26348.  
  26349.     var multids = doc.evaluate(''//tr/td/input[@type="checkbox" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  26350.     var singids = doc.evaluate(''//input[@type="hidden" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  26351.     var multid;
  26352.     var singid;
  26353.     var getstring = "/getabs/servlet/GetCitation?PrefType=ARTICLE&PrefAction=Add+Selected&fn=open_isi&source=scitation&downloadcitation=+Go+";
  26354.     if (multid = multids.iterateNext()){
  26355.         var titles = new Array();
  26356.         var ids = new Array();
  26357.         var items = new Array();
  26358.         var title;
  26359.         do {
  26360.             title = doc.evaluate(''../..//a[1]'',multid, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  26361.             items[multid.value] = Zotero.Utilities.cleanString(title.textContent);
  26362.         } while (multid =multids.iterateNext());
  26363.         
  26364.         items = Zotero.selectItems(items);
  26365.         if(!items) return true;
  26366.  
  26367.         for(var i in items) {
  26368.             getstring = getstring + "&SelectCheck=" + i;
  26369.         }
  26370.     } else if (singid = singids.iterateNext()){
  26371.         getstring = getstring + "&SelectCheck=" + singid.value;
  26372.     } 
  26373.  
  26374.     var hostRe = new RegExp("^(https?://[^/]+)/");
  26375.     var m = hostRe.exec(url);
  26376.     var host = m[1];
  26377.     var newuri = host + getstring;
  26378.     Zotero.Utilities.HTTP.doGet(newuri, function(text) {
  26379.         // load translator for RIS
  26380.         var translator = Zotero.loadTranslator("import");
  26381.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  26382.         translator.setString(text);
  26383.         translator.setHandler("itemDone", function(obj, item) {
  26384.             var doi = text.match(/ER\s{2}\-\s.*org\/(.*)\n/)[1];
  26385.             if (doi) item.DOI = doi;
  26386.             item.complete();
  26387.         });
  26388.         translator.translate();
  26389.  
  26390.         Zotero.done();
  26391.     });
  26392.     Zotero.wait();
  26393. }');
  26394.  
  26395.  
  26396. REPLACE INTO translators VALUES ('b56d756e-814e-4b46-bc58-d61dccc9f32f', '1.0.10', '', '2009-01-11 02:17:07', 1, 100, 4, 'Nagoya University OPAC', 'Frank Bennett', '^http://opac.nul.nagoya-u.ac.jp/',
  26397. 'function detectWeb(doc, url) {
  26398.     if (url.match(/.*[^A-Za-z0-9]ID=[A-Z0-9].*$/)) {
  26399.         var journal_test = doc.evaluate( ''//td[contains(text(),"frequency of publication") or contains(text(),"σ╖╗µ¼íπâ╗σ╣┤µ£êµ¼í")]'',  doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  26400.         if (!journal_test) {
  26401.             return "book";
  26402.         }
  26403.     }
  26404. }',
  26405. '/*
  26406.  * Set the texts used to find raw citation elements
  26407.  */
  26408. function setSpec() {
  26409.     var spec = new Array();
  26410.     spec[''title''] = [''Θíîπüèπéêπü│'',''title and statement''];    
  26411.     spec[''year''] = [''σç║τëêπâ╗ΘáÆσ╕â'',''publication,distribution''];
  26412.     spec[''isbn''] = [''σ¢╜ΘÜ¢µ¿Öµ║ûσ¢│µ¢╕'',''international standard book''];
  26413.     spec[''authors''] = [''ΦæùΦÇൿÖτ¢«'',''author link''];
  26414.     spec[''series''] = [''µ¢╕Φ¬îµºïΘÇá'',''parent bibliography''];
  26415.     return spec;
  26416. }
  26417.  
  26418. /*
  26419.  * Extract raw string sets from the page.  This is the only function that uses
  26420.  * xpath.  The string sets retrieved for each label registered by setSpec is 
  26421.  * stored as a list, to cope with the possibility of multiple instances of the
  26422.  * same label with different data.
  26423.  */
  26424. function getData(doc, spec) {
  26425.     var namespace = doc.documentElement.namespaceURI;
  26426.     var nsResolver = namespace ? function(prefix) {
  26427.         if (prefix == ''x'') return namespace; else return null;
  26428.     } : null;
  26429.     var data = new Object();
  26430.     for (key in spec) {
  26431.         var check = doc.evaluate("//td[contains(text(),''"+spec[key][0]+"'') or contains(text(),''"+spec[key][1]+"'')]/following-sibling::td", doc, nsResolver, XPathResult.ANY_TYPE, null);
  26432.         var c = check.iterateNext();
  26433.         while (c) {
  26434.             if (!data[key] ) {
  26435.                 data[key] = new Array();
  26436.             }
  26437.             data[key].push(Zotero.Utilities.cleanString(c.textContent));
  26438.             c = check.iterateNext();
  26439.         }
  26440.     }
  26441.     return data;
  26442. }
  26443.  
  26444. /*
  26445.  * Chop a semicolon-delimited string of authors out of a raw title string,
  26446.   * check it for Japanese characters, and save the raw string for each author
  26447.   * to an array.  If no Japanese authors were found, save directly to the item 
  26448.   * object. 
  26449.  */
  26450. parseRomanAuthors = function (item,data) {
  26451.     var datastring = data[''title''][0];
  26452.     // don''t bother if there is no author info
  26453.     if ( ! datastring.match(/.*\/.*/) ) {
  26454.         return true;
  26455.     }
  26456.     // cut off the title
  26457.     datastring = datastring.replace(/.*\//, "");
  26458.     // raise flag if there are japanese characters
  26459.     var japanese_check = datastring.match(/.*[^- &0-9()\[\];:,.a-zA-Z].*/);
  26460.     // replace comma with semicolon in certain cases, to prepare for split
  26461.     datastring = datastring.replace(/,(\s+[a-zA-Z]{3,})/, ";$1");
  26462.     datastring = datastring.replace(/,(\s+[a-zA-Z]{1}[^a-zA-Z])/, ";$1");
  26463.     datastring = datastring.replace(/(\s+and\s+)/, "; ");
  26464.     datastring = datastring.replace(/(\s+&\s+)/, "; ");
  26465.     // split the authors
  26466.     var authors = datastring.replace(/\|.*/, "").split(";");
  26467.     // this is parsing the authors for a single work.  if there is a special byline, we
  26468.     // assume that it applies to all subsequent entries until overridden.
  26469.     var authortype = ''author'';
  26470.     for (i in authors) {
  26471.         item.authorstrings.push(authors[i]);
  26472.         var authortypehint = authors[i].replace(/^([ ,.:a-z]*).*/, "$1");
  26473.         if ( authortypehint.match(/.*(edit|organiz).*/) ) {
  26474.             authortype = "editor";
  26475.         } else if ( authortypehint.match(/.*trans.*/) ) {
  26476.             authortype = "translator";
  26477.         }
  26478.         author = authors[i].replace(/^[ a-z]*/, "").replace( /\.\.\..*/, "" );
  26479.         // need to test for length because the replacement of commas with semicolons
  26480.         // can cause a short split at the end of a byline that originally ended in a comma 
  26481.         if ( ! japanese_check && author.length ) {
  26482.             item.creators.push(Zotero.Utilities.cleanAuthor(author, authortype));
  26483.         }
  26484.     }
  26485.     return japanese_check;
  26486. }
  26487.  
  26488. /*
  26489.  * For each author link, attempt to find a hint that the person
  26490.  * is an editor or translator, first in the link text itself, then in
  26491.  * the list of raw author strings captured by parseRomanAuthors.
  26492.  * Clean out cruft, reverse the order of each name, and save
  26493.  * directly to the item object.
  26494.  */
  26495. parseJapaneseAuthors = function ( item, data ) {
  26496.     var authortype = author;
  26497.     var authors = data[''authors''];
  26498.     for (i in authors ) {
  26499.         if ( authors[i].match(/.*τ╖¿.*/) ) {
  26500.             authortype = ''editor'';
  26501.         } else if ( authors[i].match(/.*Φ¿│.*/) ) {
  26502.             authortype = ''translator'';
  26503.         } else {
  26504.             authortype = ''author'';
  26505.         }
  26506.         var author = authors[i].replace(/[*]/g,"").replace(/[0-9<()|].*/, "").replace(/(.*?),(.*)/, "$2 $1");
  26507.         // If we claim to be an author, double-check in the English entries for a translator hint.
  26508.         // This is an enormous pain, but the original records are a mess, with different conventions
  26509.         // for Japanese and foreign records, sometimes mixed up in the same entry.  What are you
  26510.         // going to do.
  26511.         for ( x in item.authorstrings ) {
  26512.             var authorstring = item.authorstrings[x];
  26513.             Zotero.debug(authorstring);
  26514.             var name = author.split(" ");
  26515.             name.reverse();
  26516.             if ( authorstring.indexOf( name[0] ) > -1 && authorstring.match(/.*(Φ¿│|Φ¡»|Φ¡»Φ¿╗)$/) ) {
  26517.                 authortype = ''translator'';
  26518.                 break;
  26519.             } else if ( authorstring.indexOf( name[0] ) > -1 && authorstring.match(/.*(τ╖¿|τ╖¿Φæù)$/) ) {
  26520.                 authortype = ''editor'';
  26521.                 break;
  26522.             }
  26523.         }
  26524.         delete item.authorstrings;
  26525.         item.creators.push(Zotero.Utilities.cleanAuthor(author, authortype));
  26526.     }
  26527. }
  26528.  
  26529. /*
  26530.  * Split extracted title field.  This always starts as a single list item,
  26531.  * but can contain entries for several works, as in an omnibus volume of
  26532.  * translated works, for example.  Such records separate the elements of
  26533.  * the omnibus with periods that have no trailing space, so we use that as
  26534.  * the split point.  We discard the phonetic information appended to the end
  26535.  * of the string in Japanese records.
  26536.  */
  26537. function splitTitle(data) {
  26538.     // split in data array
  26539.     var titlestring = data[''title''][0].replace(/\|.*/, "");
  26540.     data[''title''] = titlestring.split(" . ");
  26541. }
  26542.  
  26543. /*
  26544.  * The scrape function brings the various parsing functions together
  26545.  */
  26546. function scrape(doc,url) {
  26547.     var item = new Zotero.Item("book");
  26548.     item.authorstrings = new Array();
  26549.     var spec = setSpec();
  26550.     var data = getData(doc, spec);
  26551.     splitTitle(data);
  26552.  
  26553.     if (data[''title'']) {
  26554.         var titles = new Array();
  26555.         for (i in data[''title'']) {
  26556.             titles.push( data[''title''][i].replace(/\s*\/.*/, "") );
  26557.         }
  26558.         item.title = titles.join(", ");
  26559.         jse_authors = parseRomanAuthors( item, data );
  26560.         if ( jse_authors ) {
  26561.             parseJapaneseAuthors( item, data );
  26562.         }
  26563.     }
  26564.  
  26565.     if (data[''year'']) {
  26566.         // sometimes there are multiple "date" fields, some of which are filled
  26567.         // with other random information
  26568.         for (i in data[''year'']) {
  26569.             var year = data[''year''][i];
  26570.             if ( year.match(/.*[0-9]{3}.*/) ) {
  26571.                 item.date = year.replace(/.*?([0-9][.0-9][0-9]+).*/, "$1");
  26572.                 item.place = year.replace(/:.*/, "").replace(/[\[\]]/g, "");
  26573.                 item.publisher = year.replace(/.*:(.*),.*/, "$1");
  26574.                 break;
  26575.             }
  26576.         }
  26577.     }
  26578.     
  26579.     if (data[''series'']) {
  26580.         item.series = data[''series''][0].replace(/<.*/, "");
  26581.     }
  26582.     
  26583.     if (data[''isbn'']) {
  26584.         item.ISBN = data[''isbn''][0].replace(/[^0-9]*([0-9]+).*/, "$1");
  26585.     }
  26586.     
  26587.     item.complete();
  26588. }
  26589.  
  26590. function doWeb(doc, url) {
  26591.     articles = [url];
  26592.     Zotero.Utilities.processDocuments(articles, scrape, function() {
  26593.         Zotero.done();
  26594.     });
  26595.     Zotero.wait();
  26596. }');
  26597.  
  26598.  
  26599. REPLACE INTO translators VALUES ('2c310a37-a4dd-48d2-82c9-bd29c53c1c76', '1.0.0b3.r1', '', '2008-04-12 18:40:00', '1', '100', '4', 'PROLA', 'Eugeniy Mikhailov and Michael Berkowitz', 'https?://(?:www\.)?prola.aps.org/(toc|searchabstract|abstract)/', 
  26600. 'function detectWeb(doc, url) {
  26601.     if (url.indexOf("toc") != -1) {
  26602.         return "multiple";
  26603.     } else {
  26604.         return "journalArticle";
  26605.     }
  26606. }    ', 
  26607. 'function doWeb(doc, url) {
  26608.         var arts = new Array();
  26609.         if (detectWeb(doc, url) == "multiple") {
  26610.             var items = Zotero.Utilities.getItemArray(doc, doc, "(abstract|abstractsearch)");
  26611.             items = Zotero.selectItems(items);
  26612.             for (var i in items) {
  26613.                 arts.push(i);
  26614.             }
  26615.         } else {
  26616.             arts = [url];
  26617.         }
  26618.         
  26619.         Zotero.Utilities.processDocuments(arts, function(newDoc) {
  26620.             Zotero.debug(newDoc.title);
  26621.             var abs = Zotero.Utilities.trimInternal(newDoc.evaluate(''//div[contains(@class, "aps-abstractbox")]/p'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  26622.             var urlRIS = newDoc.location.href;
  26623.         // so far several more or less  identical url possible
  26624.         // one is with "abstract" other with "searchabstract"
  26625.         urlRIS = urlRIS.replace(/(searchabstract|abstract)/,"export");
  26626.         var post = "type=ris";
  26627.         var snapurl = newDoc.location.href;
  26628.         var pdfurl = snapurl.replace(/(searchabstract|abstract)/, "pdf");
  26629.         Zotero.Utilities.HTTP.doPost(urlRIS, post, function(text) {
  26630.             // load translator for RIS
  26631.             var translator = Zotero.loadTranslator("import");
  26632.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  26633.             translator.setString(text);
  26634.             translator.setHandler("itemDone", function(obj, item) {
  26635.                 if (item.itemID) {
  26636.                     item.DOI = item.itemID;
  26637.                 }
  26638.                 item.attachments = [
  26639.                     {url:snapurl, title:"PROLA Snapshot", mimeType:"text/html"},
  26640.                     {url:pdfurl, title:"PROLA Full Text PDF", mimeType:"application/pdf"}
  26641.                 ];
  26642.                 item.abstractNote = abs;
  26643.                 item.complete();
  26644.             });
  26645.             translator.translate();
  26646.          });
  26647.     }, function() {Zotero.done;});
  26648.     Zotero.wait();
  26649. }');
  26650.  
  26651. REPLACE INTO translators VALUES ('cde4428-5434-437f-9cd9-2281d14dbf9', '1.0.0b3.r1', '', '2008-05-08 20:30:00', '1', '100', '4', 'Ovid', 'Simon Kornblith and Michael Berkowitz', '/(gw2|spa|spb)/ovidweb\.cgi', 
  26652. 'function detectWeb(doc, url) {
  26653.     var namespace = doc.documentElement.namespaceURI;
  26654.     var nsResolver = namespace ? function(prefix) {
  26655.         if (prefix == ''x'') return namespace; else return null;
  26656.     } : null;
  26657.     
  26658.     var results = doc.evaluate(''//div[@class="bibheader-resultsrange"]/b'', doc, nsResolver,
  26659.         XPathResult.ANY_TYPE, null).iterateNext();
  26660.     
  26661.     if(results) {
  26662.         results = Zotero.Utilities.cleanString(results.textContent);
  26663.         
  26664.         if(results.indexOf("-") != -1) {
  26665.             return "multiple";
  26666.         } else {
  26667.             return "journalArticle";
  26668.         }
  26669.     }
  26670.     
  26671.     return false;
  26672. }', 
  26673. 'function senCase(string) {
  26674.     var words = string.split(/\b/);
  26675.     for (var i = 0 ; i < words.length ; i++) {
  26676.         if (words[i].match(/[A-Z]/)) {
  26677.             words[i] = words[i][0] + words[i].substring(1).toLowerCase();
  26678.         } 
  26679.     }
  26680.     return words.join("");
  26681. }
  26682.  
  26683. function doWeb(doc, url) {
  26684.     var namespace = doc.documentElement.namespaceURI;
  26685.     var nsResolver = namespace ? function(prefix) {
  26686.         if (prefix == ''x'') return namespace; else return null;
  26687.     } : null;
  26688.     
  26689.     var results = Zotero.Utilities.cleanString(doc.evaluate(''//div[@class="bibheader-resultsrange"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  26690.     var post = "S="+doc.evaluate(''.//input[@name="S"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  26691.  
  26692.     if(results.indexOf("-") != -1) {
  26693.         var items = new Object();
  26694.         
  26695.         // Go through table rows
  26696.         if (doc.evaluate(''/html/body/form/div[substring(@class, 1, 10)="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  26697.             var tableRows = doc.evaluate(''/html/body/form/div[substring(@class, 1, 10)="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  26698.         } else if (doc.evaluate(''//div[@id="titles-records"]/table[@class="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  26699.             var tableRows = doc.evaluate(''//div[@id="titles-records"]/table[@class="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  26700.         }
  26701.         var tableRow;
  26702.         while(tableRow = tableRows.iterateNext()) {
  26703.             var id = doc.evaluate(''.//input[@name="R"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  26704.                 null).iterateNext().value;
  26705.             items[id] = Zotero.Utilities.cleanString(doc.evaluate(''.//span[@class="titles-title"]'', tableRow,
  26706.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  26707.         }
  26708.         
  26709.         var items = Zotero.selectItems(items);
  26710.         if(!items) return true;
  26711.         
  26712.         for(var i in items) {
  26713.             post += "&R="+i;
  26714.         }
  26715.     } else {
  26716.         var id = doc.evaluate(''.//input[@name="R"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  26717.             null).iterateNext().value;
  26718.         post += "&R="+id;
  26719.     }
  26720.     
  26721.     if (detectWeb(doc, url) == "multiple") {
  26722.         var selectvar = doc.evaluate(''.//input[@name="SELECT"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  26723.         var nextselect = selectvar.iterateNext().value;
  26724.         if (next = selectvar.iterateNext()) {
  26725.             post += "&SELECT=" + next.value;
  26726.         } else {
  26727.             post += "&SELECT="+ nextselect;
  26728.         }
  26729.     } else {
  26730.         post += "&SELECT=" + doc.evaluate(''.//input[@name="SELECT"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  26731.     }
  26732.     post += "&CitMan="+doc.evaluate(''.//input[@name="CitMan"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  26733.         null).iterateNext().value;
  26734.     post += "&CitManPrev="+doc.evaluate(''.//input[@name="CitManPrev"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  26735.         null).iterateNext().value;
  26736.     post += "&cmRecordSelect=SELECTED&cmFields=ALL&cmFormat=export&cmsave.x=12&cmsave.y=7";
  26737.         
  26738.     Zotero.Utilities.HTTP.doPost(url, post, function(text) {
  26739.         var lines = text.split("\n");
  26740.         var haveStarted = false;
  26741.         var newItemRe = /^<[0-9]+>/;
  26742.         
  26743.         var newItem = new Zotero.Item("journalArticle");
  26744.         
  26745.         for(var i in lines) {
  26746.             if(lines[i].substring(0,3) == "<1>") {
  26747.                 haveStarted = true;
  26748.             } else if(newItemRe.test(lines[i])) {
  26749.                 newItem.complete();
  26750.                 
  26751.                 newItem = new Zotero.Item("journalArticle");
  26752.             } else if(lines[i].substr(2, 4) == "  - " && haveStarted) {
  26753.                 var fieldCode = lines[i].substr(0, 2);
  26754.                 var fieldContent = Zotero.Utilities.cleanString(lines[i].substr(6));
  26755.                 if(fieldCode == "TI") {
  26756.                     newItem.title = fieldContent.replace(/\. \[\w+\]$/, "");
  26757.                 } else if(fieldCode == "AU") {
  26758.                     var names = fieldContent.split(", ");
  26759.                     
  26760.                     if(names.length >= 2) {
  26761.                         // get rid of the weird field codes
  26762.                         if(names.length == 2) {
  26763.                             names[1] = names[1].replace(/ [\+\*\S\[\]]+$/, "");
  26764.                         }
  26765.                         names[1] = names[1].replace(/ (?:MD|PhD|[BM]Sc|[BM]A|MPH|MB)$/i, "");
  26766.                         
  26767.                         newItem.creators.push({firstName:names[1], lastName:names[0], creatorType:"author"});
  26768.                     } else {
  26769.                         newItem.creators.push({lastName:names[0], isInstitution:true, creatorType:"author"});
  26770.                     }
  26771.                 } else if(fieldCode == "SO") {
  26772.                     if (fieldContent.match(/\d{4}/)) {
  26773.                         newItem.date = fieldContent.match(/\d{4}/)[0];
  26774.                     }
  26775.                     if (fieldContent.match(/(\d+)\((\d+)\)/)) {
  26776.                         var voliss = fieldContent.match(/(\d+)\((\d+)\)/);
  26777.                         newItem.volume = voliss[1];
  26778.                         newItem.issue = voliss[2];
  26779.                     }
  26780.                     if (fieldContent.match(/\d+\-\d+/))
  26781.                         newItem.pages = fieldContent.match(/\d+\-\d+/)[0];
  26782.                     if (fieldContent.match(/[J|j]ournal/)) {
  26783.                         newItem.publicationTitle = fieldContent.match(/[J|j]ournal[-\s\w]+/)[0];
  26784.                     } else {
  26785.                         newItem.publicationTitle = Zotero.Utilities.trimInternal(fieldContent.split(/(\.|;)/)[0]);
  26786.                     }
  26787.                 } else if(fieldCode == "SB") {
  26788.                     newItem.tags.push(Zotero.Utilities.superCleanString(fieldContent));
  26789.                 } else if(fieldCode == "KW") {
  26790.                     newItem.tags.push(fieldContent.split(/; +/));
  26791.                 } else if(fieldCode == "DB") {
  26792.                     newItem.repository = "Ovid ("+fieldContent+")";
  26793.                 } else if(fieldCode == "DI") {
  26794.                     newItem.DOI = fieldContent;
  26795.                 } else if(fieldCode == "AB") {
  26796.                     newItem.abstractNote = fieldContent;
  26797.                 }
  26798.             }
  26799.         }
  26800.         
  26801.         // last item is complete
  26802.         if(haveStarted) {
  26803.             newItem.complete();
  26804.         }
  26805.     });
  26806.     Zotero.wait();
  26807. }');
  26808.  
  26809. REPLACE INTO translators VALUES ('cb48083-4d9-4ed-ac95-2e93dceea0ec', '1.0.0b3.r1', '', '2008-04-28 17:50:00', '1', '100', '4', 'Blackwell Synergy', 'Michael Berkowitz', 'https?://www\.blackwell-synergy\.com[^/]*/(?:action/doSearch|doi/|links/doi/)', 
  26810. 'function detectWeb(doc, url) {
  26811.     if(url.indexOf("doSearch") != -1) {
  26812.         return "multiple";
  26813.     } else {
  26814.         return "journalArticle";
  26815.     }
  26816. }', 
  26817. 'function titleCase(str) {
  26818.     var skipWords = ["but", "or", "yet", "so", "for", "and", "nor", "a", "an", "the", "at", "by", "from", "in", "into", "of", "on", "to", "with", "up", "down", "as"];
  26819.     var words = str.toLowerCase().split(/\s+/);
  26820.     var newstr = "";
  26821.     for each (var word in words) {
  26822.         if (skipWords.indexOf(word.replace(/[^a-zA-Z]+/, "")) != -1) {
  26823.             newstr += " " + word;
  26824.         } else if (word.indexOf("-") != -1) {
  26825.             newword = word.split("-");
  26826.             newstr += " " + newword[0][0].toUpperCase() + newword[0].substr(1) + "-" + newword[1][0].toUpperCase() + newword[1].substr(1);
  26827.         } else {
  26828.             newstr += " " + word[0].toUpperCase() + word.substr(1);
  26829.         }
  26830.     }
  26831.     return Zotero.Utilities.trimInternal(newstr);
  26832. }
  26833.  
  26834. function doWeb(doc, url) {
  26835.     var host = doc.location.host;
  26836.     var articles = new Array();
  26837.     if (detectWeb(doc, url) == "multiple") {
  26838.         var items = new Object();
  26839.         var rows = doc.evaluate(''//div[@class="toc_item"]'', doc, null, XPathResult.ANY_TYPE, null);
  26840.         var row;
  26841.         while (row = rows.iterateNext()) {
  26842.             var title = Zotero.Utilities.trimInternal(doc.evaluate(''.//label'', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  26843.             var id = doc.evaluate(''.//input[@name="doi"]'', row, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  26844.             items[id] = title;
  26845.         }
  26846.         items = Zotero.selectItems(items);
  26847.         for (var i in items) {
  26848.             articles.push(i);
  26849.         }
  26850.     } else {
  26851.         articles = [decodeURIComponent(url).match(/doi\/(abs\/)?([^\?]+)(\?|$)/)[2]];
  26852.     }
  26853.     
  26854.     var post = "";
  26855.     for each (var doi in articles) {
  26856.         post += "doi=" + encodeURIComponent(doi) + "&"
  26857.     }
  26858.     post += "include=abs&format=refman&submit=Download+references";
  26859.     Zotero.Utilities.HTTP.doPost(''http://www.blackwell-synergy.com/action/downloadCitation'', post, function(text) {
  26860.         text = text.replace(/(Y1\s+\-\s+)(\d{4}\/\d{2}).*\n/, "$1$2\n");
  26861.         var translator = Zotero.loadTranslator("import");
  26862.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  26863.         translator.setString(text);
  26864.         translator.setHandler("itemDone", function(obj, item) { 
  26865.             item.DOI = Zotero.Utilities.trimInternal(item.notes[0][''note''].substr(4));
  26866.             item.notes = new Array();
  26867.             item.attachments = [
  26868.                 {url:item.url, title:"Blackwell Synergy Snapshot", mimeType:"text/html"},
  26869.                 {url:item.url.replace(/\/\/[^/]*/, "//" + host).replace("/doi/abs", "/doi/pdf"), title:"Blackwell Synergy Full Text PDF", mimeType:"application/pdf"}
  26870.             ];
  26871.             // use fulltext if possible
  26872.             var oldCreators = item.creators;
  26873.             item.creators = []
  26874.             for each (var author in oldCreators) {
  26875.                 if (author["lastName"] != "") {
  26876.                     item.creators.push({firstName:titleCase(author.firstName), lastName:titleCase(author.lastName), creatorType:"author"});
  26877.                 }
  26878.             }
  26879.             item.title = titleCase(item.title);
  26880.             item.complete();
  26881.         });
  26882.         translator.translate();
  26883.         
  26884.         Zotero.done();
  26885.     });
  26886. }');
  26887.  
  26888.  
  26889. REPLACE INTO translators VALUES ('df966c80-c199-4329-ab02-fa410c8eb6dc', '1.0.0b3.r1', '', '2009-02-25 07:15:00', 1, 100, 4, 'University of Chicago', 'Sean Takats', 'https?://[^/]*journals\.uchicago\.edu[^/]*/(?:doi/abs|doi/full|toc|action/doSearch)',
  26890. 'function detectWeb(doc, url) {
  26891.     if(url.indexOf("toc") != -1) {
  26892.         return "multiple";
  26893.     } else if(url.match("doSearch")) {
  26894.         return "multiple";
  26895.     } else {
  26896.         return "journalArticle";
  26897.     }
  26898. }',
  26899. 'function doWeb(doc, url) {
  26900.     var namespace = doc.documentElement.namespaceURI;
  26901.     var nsResolver = namespace ? function(prefix) {
  26902.         if (prefix == ''x'') return namespace; else return null;
  26903.     } : null;
  26904.     
  26905.     var proxyURL ="";
  26906.     var proxyRe = /http:\/\/([^\/]*)/;
  26907.     var m = proxyRe.exec(doc.location.href);
  26908.     if(m) {
  26909.         proxyURL = m[1];
  26910.     }
  26911.  
  26912.     var post = "";
  26913.     
  26914.     var fulltext = new Object();
  26915.     
  26916.     if(url.indexOf("toc") != -1) {
  26917.         var items = new Array();
  26918.         var links = new Array();
  26919.         
  26920.         var tableRows = doc.evaluate(''//li[div[@class="articleListing_col3"]/label][//input[@name="doi"]]'', doc,
  26921.             nsResolver, XPathResult.ANY_TYPE, null);
  26922.         var tableRow;
  26923.         // Go through table rows
  26924.         while(tableRow = tableRows.iterateNext()) {
  26925.             var id = doc.evaluate(''.//input[@name="doi"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  26926.                 null).iterateNext().value;
  26927.             items[id] = Zotero.Utilities.trimInternal(doc.evaluate(''.//label'', tableRow,
  26928.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  26929.         }
  26930.         
  26931.         var items = Zotero.selectItems(items);
  26932.         if(!items) return true;
  26933.         
  26934.         // find all fulltext links so we can determine where we can scrape the fulltext article
  26935.         var fulltextLinks = doc.evaluate(''//a[starts-with(text(), "Full Text")]'', doc,
  26936.             nsResolver, XPathResult.ANY_TYPE, null);
  26937.         var fulltextLink;
  26938.         while(fulltextLink = fulltextLinks.iterateNext()) {
  26939.             links.push(fulltextLink.href.toString());
  26940.         }
  26941.         
  26942.         for(var i in items) {
  26943.             post += "doi="+encodeURIComponent(i)+"&";
  26944.             
  26945.             // check for fulltext links
  26946.             for each(var link in links) {
  26947.                 if(link.indexOf(i) != -1) {
  26948.                     fulltext[i] = true;
  26949.                     break;
  26950.                 }
  26951.             }
  26952.         }
  26953.     } else if(url.match("doSearch")) { // do search result, yes lots of duped code, please forgive
  26954.         var items = new Array();
  26955.         var links = new Array();
  26956.         
  26957.         var tableRows = doc.evaluate(''//li[div[@class="articleResult_col2"]/h3/label][//input[@name="doi"]]'', doc,
  26958.             nsResolver, XPathResult.ANY_TYPE, null);
  26959.         var tableRow;
  26960.         // Go through table rows
  26961.         while(tableRow = tableRows.iterateNext()) {
  26962.             var id = doc.evaluate(''.//input[@name="doi"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  26963.                 null).iterateNext().value;
  26964.             items[id] = Zotero.Utilities.trimInternal(doc.evaluate(''.//label'', tableRow,
  26965.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  26966.         }
  26967.         
  26968.         var items = Zotero.selectItems(items);
  26969.         if(!items) return true;
  26970.         
  26971.         // find all fulltext links so we can determine where we can scrape the fulltext article
  26972.         var fulltextLinks = doc.evaluate(''//a[starts-with(text(), "Full Text")]'', doc,
  26973.             nsResolver, XPathResult.ANY_TYPE, null);
  26974.         var fulltextLink;
  26975.         while(fulltextLink = fulltextLinks.iterateNext()) {
  26976.             links.push(fulltextLink.href.toString());
  26977.         }
  26978.         
  26979.         for(var i in items) {
  26980.             post += "doi="+encodeURIComponent(i)+"&";
  26981.             
  26982.             // check for fulltext links
  26983.             for each(var link in links) {
  26984.                 if(link.indexOf(i) != -1) {
  26985.                     fulltext[i] = true;
  26986.                     break;
  26987.                 }
  26988.             }
  26989.         }
  26990.         
  26991.     } else {
  26992.         var m = url.match(/https?:\/\/[^\/]+\/doi\/[^\/]+\/([^\?]+)(\?|$)/);
  26993.         if (m) {
  26994.             var doi = m[1];
  26995.         } else {
  26996.             m = url.match(/https?:\/\/[^\/]+\/links\/doi\/([^\?]+)(\?|$)/);
  26997.             var doi = m[1];
  26998.         }
  26999.         post += "doi="+encodeURIComponent(doi)+"&";
  27000.             
  27001.         if(url.indexOf("doi/full") != -1 ||
  27002.           doc.evaluate(''//img[@alt="Full Text Article"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  27003.           null).iterateNext()) {
  27004.             fulltext[doi] = true;
  27005.         }
  27006.     }
  27007.     
  27008.     post += "include=cit&downloadFileName=deadbeef&format=refman&direct=on&submit=Download+article+citation+data";
  27009.     Zotero.Utilities.HTTP.doPost("http://www.journals.uchicago.edu/action/downloadCitation", post, function(text) {
  27010.         // load translator for RIS
  27011.         var translator = Zotero.loadTranslator("import");
  27012.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  27013.         translator.setString(text);
  27014.         translator.setHandler("itemDone", function(obj, item) {
  27015.             item.attachments = [
  27016.                 {url:item.url.replace("www.journals.uchicago.edu", proxyURL), title:"University of Chicago Journals Snapshot", mimeType:"text/html"},
  27017.                 {url:item.url.replace("www.journals.uchicago.edu", proxyURL).replace("/doi/abs", "/doi/pdf"), title:"University of Chicago Full Text PDF", mimeType:"application/pdf"}
  27018.             ];
  27019.             if (item.notes[0][''note'']) item.DOI = Zotero.Utilities.trimInternal(item.notes[0][''note''].substr(4));
  27020.             item.notes = new Array();
  27021.             // use fulltext if possible
  27022.             if(fulltext[item.DOI]) {
  27023.                 item.attachments[0].url = item.attachments[0].url.replace("/doi/abs", "/doi/full");
  27024.             }
  27025.             
  27026.             item.complete();
  27027.         });
  27028.         translator.translate();
  27029.         
  27030.         Zotero.done();
  27031.     });
  27032.         
  27033.     Zotero.wait();
  27034. }');
  27035.  
  27036.  
  27037. REPLACE INTO translators VALUES ('f8765470-5ace-4a31-b4bd-4327b960ccd', '1.0.0b3.r1', '', '2008-04-12 18:40:00', '1', '100', '4', 'SpringerLink', 'Simon Kornblith and Michael Berkowitz', 'https?://(www\.)*springerlink\.com|springerlink.metapress.com[^/]*/content/', 
  27038. 'function detectWeb(doc, url) {
  27039.     var namespace = doc.documentElement.namespaceURI;
  27040.     var nsResolver = namespace ? function(prefix) {
  27041.         if (prefix == ''x'') return namespace; else return null;
  27042.     } : null;
  27043.     
  27044.     if((doc.title == "SpringerLink - All Search Results") || (doc.title == "SpringerLink - Journal Issue")) {
  27045.         return "multiple";
  27046.     } else if(doc.title == "SpringerLink - Book Chapter") {
  27047.         return "bookSection";
  27048.     } else if (doc.title == "SpringerLink - Book") {
  27049.         return "book";
  27050.     } else if (doc.title == "SpringerLink - Journal Article") {
  27051.         return "journalArticle";
  27052.     } else if(doc.evaluate(''//a[text() = "RIS"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  27053.         return "journalArticle";
  27054.     }
  27055. }', 
  27056. 'function doWeb(doc, url) {
  27057.     var namespace = doc.documentElement.namespaceURI;
  27058.     var nsResolver = namespace ? function(prefix) {
  27059.         if (prefix == ''x'') return namespace; else return null;
  27060.     } : null;
  27061.     
  27062.     var m = url.match(/https?:\/\/[^\/]+/);
  27063.     var host = m[0];
  27064.     
  27065.     if(detectWeb(doc, url) == "multiple") {
  27066.         var items = new Object();
  27067.         if (doc.title == "SpringerLink - Journal Issue") {
  27068.             var items = Zotero.Utilities.getItemArray(doc, doc.getElementsByTagName("table")[8], ''/content/[^/]+/\\?p=[^&]+&pi='');
  27069.         } else {
  27070.             var results = doc.evaluate(''//div[@class="listItemName"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  27071.             var result;
  27072.             while (result = results.iterateNext()) {
  27073.                 items[result.href] = Zotero.Utilities.trimInternal(result.textContent);
  27074.             }
  27075.         }
  27076.         items = Zotero.selectItems(items);
  27077.         if(!items) return true;
  27078.         
  27079.         var urls = new Array();
  27080.         for(var url in items) {
  27081.             urls.push(url);
  27082.         }
  27083.     } else {
  27084.         var urls = [url];
  27085.     }
  27086.     
  27087.     var RIS = new Array();
  27088.     
  27089.     for each(var item in urls) {
  27090.         var m = item.match(/\/content\/([^/]+)/);
  27091.         RIS.push(host+"/export.mpx?code="+m[1]+"&mode=ris");
  27092.     }
  27093.     Zotero.Utilities.HTTP.doGet(RIS, function(text) {
  27094.         // load translator for RIS
  27095.         text = text.replace("CHAPTER", "CHAP");
  27096.         var translator = Zotero.loadTranslator("import");
  27097.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  27098.         translator.setString(text);
  27099.         translator.setHandler("itemDone", function(obj, item) {
  27100.             var url = urls.shift();
  27101.             var m = url.match(/https?:\/\/[^\/]+\/content\/[^\/]+\/?/);
  27102.             item.attachments = [
  27103.                 {url:url, title:"SpringerLink Snapshot", mimeType:"text/html"},
  27104.                 {url:m[0]+"fulltext.pdf", title:"SpringerLink Full Text PDF", mimeType:"application/pdf"}
  27105.             ];
  27106.             
  27107.             var oldCreators = item.creators;
  27108.             item.creators = new Array();
  27109.             for each (var creator in oldCreators) {
  27110.                 if (creator[''lastName''] + creator[''firstName''] != "") {
  27111.                     var fName = creator[''firstName''] ? creator[''firstName''] : "";
  27112.                     item.creators.push({firstName:Zotero.Utilities.trimInternal(fName), lastName:creator[''lastName''], creatorType:"author"});
  27113.                 }
  27114.             }
  27115.             
  27116.             // fix incorrect chapters
  27117.             if(item.publicationTitle && item.itemType == "book") item.title = item.publicationTitle;
  27118.             
  27119.             // fix "V" in volume
  27120.             if(item.volume) {
  27121.                 item.volume = item.volume.replace("V", "");
  27122.             }
  27123.             item.complete();
  27124.         });
  27125.         translator.translate();
  27126.     }, function() { Zotero.done() });
  27127.     Zotero.wait();
  27128. }');
  27129.  
  27130. REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3.r1', '', '2008-03-26 03:00:00', '1', '100', '4', 'Nature', 'Simon Kornblith', 'https?://www\.nature\.com[^/]*/(?:[^/]+/journal/v[^/]+/n[^/]+/(?:(?:full|abs)/.+\.html|index.html)|search/executeSearch)', 
  27131. 'function detectWeb(doc, url) {
  27132.     var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+\.)html/;
  27133.     
  27134.     if (articleRe.test(url)) {
  27135.         if (doc.evaluate(''//a[contains(@href, ".ris")]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  27136.             return "journalArticle";
  27137.         } else { return false; }
  27138.     } else {
  27139.         var namespace = doc.documentElement.namespaceURI;
  27140.         var nsResolver = namespace ? function(prefix) {
  27141.             if (prefix == ''x'') return namespace; else return null;
  27142.         } : null;
  27143.         
  27144.         var tableRows = doc.evaluate(''//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]'',
  27145.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  27146.         var fulltextLinks = doc.evaluate(''//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]'',
  27147.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  27148.         
  27149.         if(tableRows.iterateNext() && fulltextLinks.iterateNext()) {
  27150.             return "multiple";
  27151.         }
  27152.     }
  27153.     
  27154.     return false;
  27155. }', 
  27156. 'function doWeb(doc, url) {
  27157.     var namespace = doc.documentElement.namespaceURI;
  27158.     var nsResolver = namespace ? function(prefix) {
  27159.         if (prefix == ''x'') return namespace; else return null;
  27160.     } : null;
  27161.     
  27162.     var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+)\.html/;
  27163.     var m = articleRe.exec(url);
  27164.     
  27165.     if(!m) {
  27166.         // search page
  27167.         var items = new Array();
  27168.         
  27169.         var tableRows = doc.evaluate(''//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]'',
  27170.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  27171.         var fulltextLinks = doc.evaluate(''//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]'',
  27172.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  27173.         var tableRow, fulltextLink;
  27174.         while((tableRow = tableRows.iterateNext()) && (fulltextLink = fulltextLinks.iterateNext())) {
  27175.             items[fulltextLink.href] = Zotero.Utilities.cleanString(tableRow.textContent);
  27176.         }
  27177.         
  27178.         items = Zotero.selectItems(items);
  27179.         if(!items) return true;
  27180.         
  27181.         var urls = new Array();
  27182.         for(var url in items) {
  27183.             urls.push(url);
  27184.         }
  27185.     } else {
  27186.         var urls = [url];
  27187.     }
  27188.     
  27189.     var RIS = new Array();
  27190.     var regexps = new Array();
  27191.     
  27192.     for each(var item in urls) {
  27193.         var m = articleRe.exec(item);
  27194.         if(m[3][m[3].length-2] == "_") {
  27195.             m[3] = m[3].substr(0, m[3].length-2);
  27196.         }
  27197.         RIS.push(m[1]+"ris"+m[3]+".ris");
  27198.         regexps.push(m);
  27199.     }
  27200.     
  27201.     Zotero.Utilities.HTTP.doGet(RIS, function(text) {
  27202.         var url = urls.shift();
  27203.         // load translator for RIS
  27204.         var translator = Zotero.loadTranslator("import");
  27205.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  27206.         translator.setString(text);
  27207.         translator.setHandler("itemDone", function(obj, item) {
  27208.             var m = regexps.shift();
  27209.             item.attachments = [
  27210.                 {url:m[0], title:"Nature Snapshot", mimeType:"text/html"},
  27211.                 {url:m[1]+"pdf"+m[3]+".pdf", title:"Nature Full Text PDF", mimeType:"application/pdf"}
  27212.             ]
  27213.             
  27214.             item.notes = new Array();
  27215.             if (item.date) item.date = item.date.replace("print ", "");
  27216.             
  27217.             item.complete();
  27218.         });
  27219.         translator.translate();
  27220.     }, function() { Zotero.done(); });
  27221.         
  27222.     Zotero.wait();
  27223. }');
  27224.  
  27225. REPLACE INTO translators VALUES ('92d4ed84-8d0-4d3c-941f-d4b9124cfbb', '1.0.0b3.r1', '', '2008-10-20 17:35:00', '1', '100', '4', 'IEEE Xplore', 'Simon Kornblith and Michael Berkowitz', 'https?://[^/]*ieeexplore.ieee.org[^/]*/(?:[^\?]+\?(?:|.*&)arnumber=[0-9]+|search/(?:searchresult.jsp|selected.jsp))', 
  27226. 'function detectWeb(doc, url) {
  27227.     var articleRe = /[?&]ar(N|n)umber=([0-9]+)/;
  27228.     var m = articleRe.exec(url);
  27229.     
  27230.     if(m) {
  27231.         return "journalArticle";
  27232.     } else {
  27233.         return "multiple";
  27234.     }
  27235.     
  27236.     return false;
  27237. }', 
  27238. 'function doWeb(doc, url) {
  27239.     var namespace = doc.documentElement.namespaceURI;
  27240.     var nsResolver = namespace ? function(prefix) {
  27241.         if (prefix == ''x'') return namespace; else return null;
  27242.     } : null;
  27243.     
  27244.     var articleRe = /[?&]ar(N|n)umber=([0-9]+)/;
  27245.     var m = articleRe.exec(url);
  27246.     
  27247.     if(detectWeb(doc, url) == "multiple") {
  27248.         // search page
  27249.         var items = new Array();
  27250.         
  27251.         var tableRows = doc.evaluate(''//table[tbody/tr/td/div/strong]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  27252.         var tableRow;
  27253.         while(tableRow = tableRows.iterateNext()) {
  27254.             var link = doc.evaluate(''.//a[@class="bodyCopy"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  27255.                 null).iterateNext().href;
  27256.             
  27257.             var title = "";
  27258.             var strongs = tableRow.getElementsByTagName("strong");
  27259.             for each(var strong in strongs) {
  27260.                 if(strong.textContent) {
  27261.                     title += strong.textContent+" ";
  27262.                 }
  27263.             }
  27264.             
  27265.             items[link] = Zotero.Utilities.cleanString(title);
  27266.         }
  27267.         
  27268.         items = Zotero.selectItems(items);
  27269.         if(!items) return true;
  27270.         
  27271.         var urls = new Array();
  27272.         for(var url in items) {
  27273.             urls.push(url);
  27274.         }
  27275.     } else {
  27276.         var urls = [url];
  27277.     }
  27278.     var arnumber = "";
  27279.     for each(var url in urls) {
  27280.         var m = articleRe.exec(url);
  27281.         arnumber = "%3Carnumber%3E"+m[2]+"%3C%2Farnumber%3E";
  27282.         var post = "dlSelect=cite_abs&fileFormate=ris&arnumber="+arnumber+"&x=5&y=10";
  27283.         var isRe = /[?&]isnumber=([0-9]+)/;
  27284.         var puRe = /[?&]punumber=([0-9]+)/;
  27285.         Zotero.Utilities.HTTP.doPost("http://ieeexplore.ieee.org/xpls/citationAct", post, function(text) {
  27286.             // load translator for RIS
  27287.             var translator = Zotero.loadTranslator("import");
  27288.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  27289.             translator.setString(text);
  27290.             translator.setHandler("itemDone", function(obj, item) {
  27291.                 var url = urls.shift();
  27292.                 var is = isRe.exec(url);
  27293.                 var pu = puRe.exec(url);
  27294.                 var arnumber = articleRe.exec(url);
  27295.                 if(item.notes[0] && item.notes[0].note) {
  27296.                     item.abstractNote = item.notes[0].note;
  27297.                     item.notes = new Array();
  27298.                 }
  27299.                 var dupes = new Array();
  27300.                 for (var i = 0 ; i < item.creators.length - 1 ; i++) {
  27301.                     if (item.creators[i].lastName + item.creators[i].firstName == item.creators[i+1].lastName + item.creators[i].firstName) {
  27302.                         dupes.push(i + 1);
  27303.                     }
  27304.                 }
  27305.                 
  27306.                 for (var i in dupes) {
  27307.                     delete item.creators[dupes[i]];
  27308.                 }
  27309.                 var dupes = [];
  27310.                 for (var i = 0 ; i < item.creators.length ; i++) {
  27311.                     if (item.creators[i]) {
  27312.                         dupes.push(item.creators[i]);
  27313.                     }
  27314.                 }
  27315.                 item.creators = dupes;
  27316.                 var newurls = [url];
  27317.                 Zotero.Utilities.processDocuments(newurls, function(newDoc) {
  27318.                     var xpath = ''//p[@class="bodyCopyBlackLargeSpaced"]'';
  27319.                     var textElmt = newDoc.evaluate(xpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext();
  27320.                     if (textElmt) {
  27321.                         var m = textElmt.textContent.match(/Identifier:\s+([^\n]*)\n/);
  27322.                         if (m){
  27323.                             item.DOI = m[1];
  27324.                         }
  27325.                     }
  27326.                     var pdfpath = ''//td[2][@class="bodyCopyBlackLarge"]/a[@class="bodyCopy"][substring(text(), 1, 3) = "PDF"]'';
  27327.                     var pdfurlElmt = newDoc.evaluate(pdfpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext();
  27328.                     if (pdfurlElmt) {
  27329.                         pdfurlElmt.href = pdfurlElmt.href.substr(0,32) + ''PDF/getPDF'' + pdfurlElmt.href.substr(38);
  27330.                         item.attachments = [{url:pdfurlElmt.href, title:"IEEE Xplore Full Text PDF", mimeType:"application/pdf"}];
  27331.                     }
  27332.                     item.complete();
  27333.                 }, function() {Zotero.done;});
  27334.             });
  27335.             translator.translate();
  27336.         });
  27337.     }
  27338.     Zotero.wait();
  27339. }');
  27340.  
  27341. REPLACE INTO translators VALUES ('7bdb79e-a47f-4e3d-b317-ccd5a0a74456', '1.0.0b3.r1', '', '2008-05-20 19:10:00', '1', '100', '4', 'Factiva', 'Simon Kornblith', 'https?://[^/]*global\.factiva\.com[^/]*/ha/default\.aspx$', 
  27342. 'function detectWeb(doc, url) {
  27343.     var namespace = doc.documentElement.namespaceURI;
  27344.     var nsResolver = namespace ? function(prefix) {
  27345.         if (prefix == ''x'') return namespace; else return null;
  27346.     } : null;
  27347.     
  27348.     if(doc.evaluate(''//tr[@class="headline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  27349.         if(doc.body.className == ''articleView'') {
  27350.             return "newspaperArticle";
  27351.         } else {
  27352.             return "multiple";
  27353.         }
  27354.     }
  27355. }', 
  27356. 'function doWeb(doc, url) {
  27357.     var namespace = doc.documentElement.namespaceURI;
  27358.     var nsResolver = namespace ? function(prefix) {
  27359.         if (prefix == ''x'') return namespace; else return null;
  27360.     } : null;
  27361.     
  27362.     var items = new Array();
  27363.     var singlePage = doc.body.className == ''articleView'';
  27364.     
  27365.     var tableRows = doc.evaluate(''//tr[@class="headline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  27366.     var tableRow;
  27367.     while(tableRow = tableRows.iterateNext()) {
  27368.         var hdl = doc.evaluate(''.//input[@name="hdl"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  27369.             null).iterateNext().value;
  27370.         if(!singlePage){
  27371.             items[hdl] = Zotero.Utilities.cleanString(tableRow.getElementsByTagName("a")[0].textContent);
  27372.         } else {
  27373.             var m = doc.evaluate(''.//td[@class="count"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, 
  27374.                 null).iterateNext().textContent.match(/[0-9]+/);
  27375.             items[m[0]] = hdl;
  27376.         }
  27377.     }
  27378.     
  27379.     if(!singlePage) {
  27380.         items = Zotero.selectItems(items);
  27381.         if(!items) return true;
  27382.         
  27383.         var hdls = new Array();
  27384.         for(var hdl in items) {
  27385.             hdls.push(hdl);
  27386.         }
  27387.     } else {
  27388.         var m = doc.evaluate(''//div[@class="articleHeader"][@id="artHdr1"]/span[substring(text(), 1, 7) = "Article"]'',
  27389.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/[0-9]+/);
  27390.         var hdls = [items[m[0]]];
  27391.     }
  27392.     
  27393.     var post = "";
  27394.     
  27395.     var hiddenInputs = doc.evaluate(''//form[@name="PageBaseForm"]//input[@type="hidden"]'', doc, nsResolver,
  27396.         XPathResult.ANY_TYPE, null);
  27397.     var hiddenInput;
  27398.     while(hiddenInput = hiddenInputs.iterateNext()) {
  27399.         // this is some weird shit, but apparently they''re very picky
  27400.         post = post+"&"+hiddenInput.name+"="+escape(hiddenInput.value).replace(/\+/g, "%2B").replace(/\%20/g, "+");
  27401.     }
  27402.     
  27403.     var selects = doc.evaluate(''//form[@name="PageBaseForm"]//select'', doc, nsResolver,
  27404.         XPathResult.ANY_TYPE, null);
  27405.     var select;
  27406.     while(select = selects.iterateNext()) {
  27407.         post = post+"&"+select.name+"="+escape(select.options[select.selectedIndex].value);
  27408.     }
  27409.     
  27410.     for each(var hdl in hdls) {
  27411.         post += "&hdl="+escape(hdl);
  27412.     }
  27413.     post = post.substr(1);
  27414.     
  27415.     Zotero.Utilities.HTTP.doPost("http://global.factiva.com/pps/default.aspx?pp=XML", post, function(text) {
  27416.         // Remove xml parse instruction and doctype
  27417.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  27418.         // kill the XML namespace, too, because we have no way of knowing what it will be, which presents a problem
  27419.         text = text.replace(/<ppsArticleResponse xmlns="[^"]+">/, "<ppsArticleResponse>");
  27420.         // kill hlt tags; they just make parsing harder
  27421.         text = text.replace(/<\/?hlt>/g, "");
  27422.         var xml = new XML(text);
  27423.         
  27424.         // loop through articles
  27425.         for each(var ppsarticle in xml[0]..ppsarticle) {
  27426.             var article = ppsarticle.article;
  27427.             var newItem = new Zotero.Item("newspaperArticle");
  27428.             
  27429.             newItem.title = Zotero.Utilities.cleanString(article.headline.paragraph.text().toString());
  27430.             newItem.publicationTitle = Zotero.Utilities.cleanString(article.sourceName.text().toString());
  27431.             for each(var tag in article..name) {
  27432.                 newItem.tags.push(tag.text().toString());
  27433.             }
  27434.             newItem.date = Zotero.Utilities.formatDate(Zotero.Utilities.strToDate(article.publicationDate.date.text().toString()));
  27435.             if(article.byline.length()) {
  27436.                 var byline = Zotero.Utilities.cleanString(article.byline.text().toString().replace(/By/i, ""));
  27437.                 var authors = byline.split(/ (?:\&|and) /i);
  27438.                 for each(var author in authors) {
  27439.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  27440.                 }
  27441.             }
  27442.             newItem.section = article.sectionName.text().toString();
  27443.             newItem.edition = article.edition.text().toString();
  27444.             
  27445.             if(article.pages.length()) {
  27446.                 newItem.pages = "";
  27447.                 for each(var page in article.pages.page) {
  27448.                     newItem.pages += ","+page.text().toString();
  27449.                 }
  27450.                 newItem.pages = newItem.pages.substr(1);
  27451.             }
  27452.             
  27453.             var m = article.volume.text().toString().match(/ISSN[:\s]*([\-0-9]{8,9})/i);
  27454.             if(m) newItem.ISSN = m[1];
  27455.             
  27456.             newItem.complete();
  27457.         }
  27458.         
  27459.         Zotero.done();
  27460.     });
  27461.         
  27462.     Zotero.wait();
  27463. }');
  27464.  
  27465. REPLACE INTO translators VALUES ('850f4c5f-71fb-4669-b7da-7fb7a95500ef', '1.0.0b3r1', '', '2008-07-08 15:35:00', '1', '100', '4', 'Cambridge Journals Online', 'Sean Takats and Michael Berkowitz', 'https?://[^/]*journals.cambridge.org[^/]*//?action/(quickSearch|search|displayAbstract|displayFulltext|displayIssue)', 
  27466. 'function detectWeb(doc, url)    {
  27467.     var namespace=doc.documentElement.namespaceURI;
  27468.     var nsResolver=namespace?function(prefix)    {
  27469.         return (prefix=="x")?namespace:null;
  27470.     }:null;
  27471.     var xpath = ''//tr[td/input[@type="checkbox"][@name="toView"]]'';
  27472.     if ((url.indexOf("/action/displayAbstract") != -1) || (url.indexOf("action/displayFulltext") != -1)){
  27473.         return "journalArticle";
  27474.     } else if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  27475.         return "multiple";            
  27476.     }
  27477. }', 
  27478. 'function doWeb(doc, url){
  27479.     var namespace=doc.documentElement.namespaceURI;
  27480.     var nsResolver=namespace?function(prefix)    {
  27481.         return (prefix=="x")?namespace:null;
  27482.     }:null;
  27483.     var host = doc.location.host;
  27484.     var urlstring="http://" + host + "/action/exportCitation";
  27485.     var datastring="format=RIS&emailId=&Download=Download&componentIds=";
  27486.     var links = new Array();
  27487.     if(detectWeb(doc, url) == "multiple"){
  27488.         var xpath = ''//tr[td/input[@type="checkbox"][@name="toView"]]'';
  27489.         var tableRows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  27490.         var tableRow;
  27491.         var items=new Array();
  27492.         while (tableRow = tableRows.iterateNext()){
  27493.             var id = doc.evaluate(''./td/input[@type="checkbox"][@name="toView"]/@value'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  27494.             var title = doc.evaluate(''./td/h3'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  27495.             items[''http://'' + host + ''/action/displayAbstract?aid='' + id.nodeValue] = Zotero.Utilities.capitalizeTitle(title.textContent);
  27496.         }
  27497.         items=Zotero.selectItems(items);
  27498.         for (var i in items) {
  27499.             links.push(i);
  27500.         }
  27501.     } else {
  27502.         links = [url];
  27503.     }
  27504.     Zotero.Utilities.processDocuments(links, function(doc) {
  27505.         if (doc.evaluate(''//p[@class="AbsType"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  27506.             var abs = doc.evaluate(''//p[@class="AbsType"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  27507.         }
  27508.         if (doc.evaluate(''//p[@class="KeyWords"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  27509.             var kws = doc.evaluate(''//p[@class="KeyWords"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(11).split(''; '');
  27510.         }
  27511.         var pdfpath=''//div/ul/li/a[contains(text(), "PDF")]'';
  27512.         if (doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  27513.             var pdflink =doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  27514.         }
  27515.         idRe = /aid=([0-9]+)/
  27516.         var m = idRe.exec(doc.location.href);
  27517.         var id = m[1];
  27518.         Zotero.Utilities.HTTP.doGet(urlstring + "?" + datastring+id, function(text) {
  27519.             text = text.replace(/(^|\n)?([A-Z\d]{2})\s+\-\s+(\n)?/g, "\n$2  - $3");
  27520.             var translator = Zotero.loadTranslator("import");
  27521.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  27522.             translator.setString(text);
  27523.             translator.setHandler("itemDone", function(obj, item) {
  27524.                 item.attachments =     [{url:url, title:"Cambridge Journals Snapshot", mimeType:"text/html"}]
  27525.                 if (pdflink) item.attachments.push({url:pdflink, title:"Cambridge Journals PDF", mimeType:"application/pdf"});
  27526.                 item.url = url;
  27527.                 item.title = Zotero.Utilities.capitalizeTitle(item.title);
  27528.                 var authors = item.creators;
  27529.                 item.creators = new Array();
  27530.                 for each (var aut in authors) {
  27531.                     item.creators.push({firstName:aut.firstName, lastName:aut.lastName, creatorType:"author"});
  27532.                 }
  27533.                 if (kws) item.tags = kws;
  27534.                 if (abs) item.abstractNote = Zotero.Utilities.trimInternal(abs);
  27535.                 item.complete();
  27536.             });
  27537.             translator.translate();
  27538.         });
  27539.     }, function() {Zotero.done;});
  27540.     Zotero.wait();
  27541. }');
  27542.  
  27543. REPLACE INTO translators VALUES ('82174f4f-8c13-403b-99b2-affc7bc7769b', '1.0.0b3.r1', '', '2008-05-28 18:30:00', '1', '100', '4', 'Cambridge Scientific Abstracts', 'Simon Kornblith and Michael Berkowitz', 'https?://[^/]+/ids70/(?:results.php|view_record.php)', 
  27544. 'function detectWeb(doc, url) {
  27545.     var namespace = doc.documentElement.namespaceURI;
  27546.     var nsResolver = namespace ? function(prefix) {
  27547.         if (prefix == ''x'') return namespace; else return null;
  27548.     } : null;
  27549.     
  27550.     if(url.indexOf("/results.php") != -1) {
  27551.         var type = doc.evaluate(''//td[@class="rt_tab_on"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  27552.             null).iterateNext().textContent;
  27553.         
  27554.         if(type.substr(0, 15) == "Published Works") {
  27555.             return "multiple";
  27556.         }
  27557.     } else {
  27558.         // default to journal
  27559.         var itemType = "journalArticle";
  27560.         
  27561.         var type = doc.evaluate(''//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]'',
  27562.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  27563.         if(type) {
  27564.             type = Zotero.Utilities.cleanString(type.textContent);
  27565.             if(type == "Book Chapter") {
  27566.                 return "bookSection";
  27567.             } else if(type.substr(0, 4) == "Book") {
  27568.                 return "book";
  27569.             } else if(type.substr(0, 12) == "Dissertation") {
  27570.                 return "thesis";
  27571.             } else if(type == "Catalog") {
  27572.                 return "magazineArticle";
  27573.             }
  27574.         }
  27575.         return "journalArticle";
  27576.     }
  27577.     
  27578.     return false;
  27579. }', 
  27580. 'function scrape(doc) {
  27581.     var namespace = doc.documentElement.namespaceURI;
  27582.     var nsResolver = namespace ? function(prefix) {
  27583.         if (prefix == ''x'') return namespace; else return null;
  27584.     } : null;
  27585.     
  27586.     var itemType = "journalArticle";
  27587.     
  27588.     var type = doc.evaluate(''//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]'',
  27589.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  27590.     if(type) {
  27591.         type = Zotero.Utilities.trimInternal(type.textContent);
  27592.         if(type == "Book Chapter") {
  27593.             itemType = "bookSection";
  27594.         } else if(type.substr(0, 4) == "Book") {
  27595.             itemType = "book";
  27596.         } else if(type.substr(0, 12) == "Dissertation") {
  27597.             itemType = "thesis";
  27598.         } else if(type == "Catalog") {
  27599.             itemType = "magazineArticle";
  27600.         }
  27601.     }
  27602.     
  27603.     var newItem = new Zotero.Item(itemType);
  27604.     
  27605.     newItem.attachments = [{document:doc, title:"Cambridge Scientific Abstracts Snapshot"}];
  27606.     newItem.title = Zotero.Utilities.trimInternal(doc.evaluate(''//tr/td[3][@class="data_emphasis"]'', doc, nsResolver,
  27607.         XPathResult.ANY_TYPE, null).iterateNext().textContent);
  27608.     
  27609.     var dataRows = doc.evaluate(''//tr[td[3][@class="data_content"]]'', doc, nsResolver,
  27610.         XPathResult.ANY_TYPE, null);
  27611.     var dataRow;
  27612.     while(dataRow = dataRows.iterateNext()) {
  27613.         var tds = dataRow.getElementsByTagName("td");
  27614.         var heading = Zotero.Utilities.trimInternal(tds[0].textContent).toLowerCase();
  27615.         var content = Zotero.Utilities.trimInternal(tds[2].textContent);
  27616.         if(heading == "database") {
  27617.             newItem.repository = "Cambridge Scientific Abstracts ("+content+")";
  27618.         } else if(heading == "author") {
  27619.             var authors = content.split("; ");
  27620.             for each(var author in authors) {
  27621.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author.replace(/\d+/g, ""), "author", true));
  27622.             }
  27623.         } else if(heading == "source") {
  27624.             if(itemType == "journalArticle") {
  27625.                 var parts = content.split(/(,|;)/);
  27626.                 newItem.publicationTitle = parts.shift();
  27627.                 for each (var i in parts) {
  27628.                     if (i.match(/\d+/)) {
  27629.                         if (i.match(/v(ol)?/)) {
  27630.                             newItem.volume = i.match(/\d+/)[0];
  27631.                         } else if (i.match(/pp/)) {
  27632.                             newItem.pages = i.match(/[\d\-]+/)[0];
  27633.                         } else if (i.match(/no?/)) {
  27634.                             newItem.issue = i.match(/\d+/)[0];
  27635.                         } else if (i.match(/\d{4}/)) {
  27636.                             newItem.date = Zotero.Utilities.trimInternal(i);
  27637.                         }
  27638.                     }
  27639.                 }
  27640.             } else if(itemType == "book") {
  27641.                 var m = content.match(/^([^:]+): ([^,0-9]+)/);
  27642.                 if(m) {
  27643.                     newItem.place = m[1];
  27644.                     newItem.publisher = m[2];
  27645.                 }
  27646.             } else if(itemType == "bookSection") {
  27647.                 if(content.length > newItem.publicationTitle.length
  27648.                    && content.substr(0, newItem.publicationTitle.length) == newItem.publicationTitle) {
  27649.                     var m = content.match(/\)\. ([^:]+): ([^,0-9]+)/);
  27650.                     if(m) {
  27651.                         newItem.place = m[1];
  27652.                         newItem.publisher = m[2];
  27653.                     }
  27654.                     var m = content.match(/\(pp. ([\-0-9]+)\)/);
  27655.                     if(m) newItem.pages = m[1];
  27656.                 }
  27657.             }
  27658.         } else if(heading == "monograph title") {
  27659.             newItem.publicationTitle = content;
  27660.         } else if(heading == "series title") {
  27661.             newItem.series = content;
  27662.         } else if(heading == "issn") {
  27663.             newItem.ISSN = content;
  27664.         } else if(heading == "isbn") {
  27665.             newItem.ISBN = content;
  27666.         } else if(heading == "abstract") {
  27667.             newItem.abstractNote = content;
  27668.         } else if(heading == "notes") {
  27669.             newItem.extra = content;
  27670.         } else if(heading == "publication year") {
  27671.             if(!newItem.date) newItem.date = content;
  27672.         } else if(heading == "information provider") {
  27673.             if(content.substr(0, 19) == "http://dx.doi.org/") {
  27674.                 newItem.DOI = content.substr(19);
  27675.             }
  27676.         } else if(heading == "journal volume") {
  27677.             newItem.volume = content;
  27678.         } else if(heading == "journal pages") {
  27679.             newItem.pages = content;
  27680.         } else if(heading == "journal issue") {
  27681.             newItem.issue = content;
  27682.         } else if(heading == "affiliation") {
  27683.             if(newItem.itemType == "thesis") {
  27684.                 newItem.publisher = content;
  27685.             }
  27686.         }
  27687.     }
  27688.     
  27689.     var terms = doc.evaluate(''//input[substring(@name, 1, 4) = "term"]'', doc, nsResolver,
  27690.         XPathResult.ANY_TYPE, null);
  27691.     var term;
  27692.     while(term = terms.iterateNext()) {
  27693.         newItem.tags.push(term.value.replace(/ [0-9]{3,}$/, ""));
  27694.     }
  27695.     
  27696.     newItem.complete();
  27697. }
  27698.  
  27699. function doWeb(doc, url) {
  27700.     if(url.indexOf("/results.php") != -1) {
  27701.         var items = Zotero.Utilities.getItemArray(doc, doc, ''/view_record\.php\?'', ''^(?:View Record|More\.{3})$'');
  27702.         
  27703.         items = Zotero.selectItems(items);
  27704.         if(!items) return true;
  27705.         
  27706.         var urls = new Array();
  27707.         for(var url in items) {
  27708.             urls.push(url);
  27709.         }
  27710.         
  27711.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done() })
  27712.         Zotero.wait();
  27713.     } else {
  27714.         scrape(doc);
  27715.     }
  27716. }');
  27717.  
  27718.  
  27719. REPLACE INTO translators VALUES ('e78d20f7-488-4023-831-dfe39679f3f', '1.0.0b3.r1', '', '2009-01-28 18:10:00', 1, 100, 4, 'ACM', 'Simon Kornblith and Michael Berkowitz', 'https?://[^/]*portal\.acm\.org[^/]*/(?:results\.cfm|citation\.cfm)',
  27720. 'function detectWeb(doc, url) {
  27721.     if(url.indexOf("/results.cfm") != -1) {
  27722.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/citation.cfm\\?[^#]+$'');
  27723.         // hack to return multiple if there are items
  27724.         for(var i in items) {
  27725.             return "multiple";
  27726.         }
  27727.     } else {
  27728.         var onClick = doc.evaluate(''//a[substring(text(), 5, 7) = "EndNote"]'', doc, null, XPathResult.ANY_TYPE,
  27729.             null).iterateNext().getAttribute("onClick");
  27730.         if(onClick.match("proceeding.article")) {
  27731.             return "conferencePaper";
  27732.         } else {
  27733.             return "journalArticle";
  27734.         }
  27735.     }
  27736. }',
  27737. 'var urls = new Array();
  27738.  
  27739. // this handles sequential loading, since first we need to process a document (to get the abstract), then
  27740. // get the Refer metadata, then process the next document, etc.
  27741. function getNext() {
  27742.     if(urls.length) {
  27743.         var url = urls.shift();
  27744.         Zotero.Utilities.processDocuments([url], function(doc) { scrape(doc); });
  27745.     } else {
  27746.         Zotero.done();
  27747.     }
  27748. }
  27749.  
  27750. function scrape(doc) {
  27751.     var onClick = doc.evaluate(''//a[substring(text(), 5, 7) = "EndNote"]'', doc, null, XPathResult.ANY_TYPE,
  27752.         null).iterateNext().getAttribute("onClick");
  27753.     var m = onClick.match(/''([^'']+)''/);
  27754.     
  27755.     if (doc.evaluate(''//div[@class="abstract"]/p[@class="abstract"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  27756.         var abstract = doc.evaluate(''//div[@class="abstract"]/p[@class="abstract"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  27757.         if (!abstract.textContent.match(/\w+/)) {
  27758.             var abstract = doc.evaluate(''//div[@class="abstract"]/p[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  27759.         }
  27760.         if(abstract) abstract = Zotero.Utilities.trimInternal(abstract.textContent);
  27761.     }
  27762.     var snapshot = doc.location.href;
  27763.     var attachments = new Array();
  27764.     var url;
  27765.     var typeLinks = doc.evaluate(''//td[@class="smaller-text"]/a[img]'', doc, null,
  27766.         XPathResult.ANY_TYPE, null);
  27767.     var typeLink;
  27768.     while(typeLink = typeLinks.iterateNext()) {
  27769.         var linkText = typeLink.textContent.toLowerCase();
  27770.         if(linkText == "pdf") {
  27771.             attachments.push({title:"ACM Full Text PDF", mimeType:"application/pdf", url:typeLink.href});
  27772.             url = typeLink.href;
  27773.         } else if(linkText == "html") {
  27774.             url = snapshot = typeLink.href;
  27775.         }
  27776.     }
  27777.     
  27778.     attachments.push({title:"ACM Snapshot", mimeType:"text/html", url:snapshot});
  27779.  
  27780.     var keywords = new Array();
  27781.     var keywordLinks = doc.evaluate(''//p[@class="keywords"]/a'', doc, null,
  27782.         XPathResult.ANY_TYPE, null);
  27783.     var keywordLink;
  27784.     while(keywordLink = keywordLinks.iterateNext()) {
  27785.         keywords.push(Zotero.Utilities.trimInternal(keywordLink.textContent.toLowerCase()));
  27786.     }
  27787.     var doi = "";
  27788.     var doiElmt = doc.evaluate(''/html/body/div/table/tbody/tr[4]/td/table/tbody/tr/td/table/tbody/tr[3]/td[2][@class="small-text"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()
  27789.     if (doiElmt){
  27790.         var match = doiElmt.textContent.match(/org\/(.*)/);
  27791.         if (match){
  27792.             doi = match[1];
  27793.         }
  27794.     }
  27795.     
  27796.     Zotero.Utilities.HTTP.doGet("http://portal.acm.org/"+m[1], function(text) {
  27797.         // split() may no longer be necessary
  27798.         var m = text.split(/<\/?pre[^>]*>/ig);
  27799.         if (m[1]) {
  27800.             var text = m[1];
  27801.         }
  27802.            // unescape HTML for extended characters
  27803.         function unescapeHTML(str, p1){
  27804.             return Zotero.Utilities.unescapeHTML("&#"+p1);
  27805.         }
  27806.            text = text.replace(/\\&\\#([^;]+;)/g, unescapeHTML);  
  27807.         // load Refer translator
  27808.         var translator = Zotero.loadTranslator("import");
  27809.         translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  27810.         translator.setString(text);
  27811.         translator.setHandler("itemDone", function(obj, item) {
  27812.             if(abstract) item.abstractNote = abstract;
  27813.             item.attachments = attachments;
  27814.             item.tags = keywords;
  27815.             item.DOI = doi;
  27816.             item.url = snapshot;
  27817.             item.complete();
  27818.         });
  27819.         translator.translate();
  27820.         
  27821.         getNext();
  27822.     });
  27823. }
  27824.  
  27825. function doWeb(doc, url) {
  27826.     if(url.indexOf("/results.cfm") != -1) {
  27827.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/citation.cfm\\?[^#]+$'');
  27828.         
  27829.         items = Zotero.selectItems(items);
  27830.         if(!items) return true;
  27831.         
  27832.         for(var url in items) {
  27833.             urls.push(url);
  27834.         }
  27835.         
  27836.         getNext();
  27837.     } else {
  27838.         scrape(doc);
  27839.     }
  27840.     
  27841.     Zotero.wait();
  27842. }');
  27843.  
  27844.  
  27845. REPLACE INTO translators VALUES ('6f5f1b24-7519-4314-880f-d7004fbcfe7e', '1.0.0b4.r5', '', '2008-07-10 06:15:00', '0', '100', '4', 'ReliefWeb', 'Michael Berkowitz', 'http://(www.)?reliefweb.int/', 
  27846. 'function detectWeb(doc, url) {
  27847.     if (url.match(/(S|s)earch(R|r)esults/)) {
  27848.         return "multiple";
  27849.     } else if (url.match(/(O|o)pen(D|d)ocument/)) {
  27850.         return "journalArticle";
  27851.     }
  27852. }', 
  27853. 'function doWeb(doc, url) {
  27854.     var arts = new Array();
  27855.     if (detectWeb(doc, url) == "multiple") {
  27856.         var items = new Object();
  27857.         var links = doc.evaluate(''//div[@id="View"]/table/tbody/tr/td[4][@class="docView"]/a'', doc, null, XPathResult.ANY_TYPE, null);
  27858.         var link;
  27859.         while (link = links.iterateNext()) {
  27860.             items[link.href] = Zotero.Utilities.trimInternal(link.textContent);
  27861.         }
  27862.         items = Zotero.selectItems(items);
  27863.         for (var i in items) {
  27864.             arts.push(i);    
  27865.         }
  27866.     } else {
  27867.         arts = [url];
  27868.     }
  27869.     Zotero.debug(arts);
  27870.     Zotero.Utilities.processDocuments(arts, function(doc) {
  27871.         var item = new Zotero.Item("journalArticle");
  27872.         item.title = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="docTitle"]/h1'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  27873.         item.date = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="link"]/p[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(6));
  27874.         item.url = doc.location.href;
  27875.         if (doc.evaluate(''//div[@id="docBody"]/p/i'',doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  27876.             var auts = doc.evaluate(''//div[@id="docBody"]/p/i'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  27877.             item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="docBody"]/p[1]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(auts, ""));
  27878.             auts = auts.replace(''By '', "").split(/\//);
  27879.             for each (var aut in auts) {
  27880.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  27881.             }
  27882.         } else {
  27883.             item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate(''//div[@id="docBody"]/p[1]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  27884.         }
  27885.             
  27886.         item.complete();
  27887.     }, function() {Zotero.done;});
  27888.     Zotero.wait();
  27889. }');
  27890.  
  27891.  
  27892. REPLACE INTO translators VALUES ('594ebe3c-90a0-4830-83bc-9502825a6810', '1.0.0b4.r5', '', '2009-02-25 07:15:00', 1, 100, 4, 'ISI Web of Knowledge', 'Michael Berkowitz', '(WOS_GeneralSearch|product=WOS)',
  27893. 'function detectWeb(doc, url) {
  27894.     if (doc.title.indexOf("Web of Science Results") != -1) {
  27895.         return "multiple";
  27896.     } else if (url.indexOf("full_record.do") != -1) {
  27897.         return "journalArticle";
  27898.     }
  27899. }',
  27900. 'function doWeb(doc, url) {
  27901.     var ids = new Array();
  27902.     if (detectWeb(doc, url) == "multiple") {
  27903.         var items = new Object;
  27904.         var xpath = ''//a[@class="smallV110"]'';
  27905.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  27906.         var next_title;
  27907.         while (next_title = titles.iterateNext()) {
  27908.             items[next_title.href.match(/\?(.*)/)[1]] = next_title.textContent;
  27909.         }
  27910.         items = Zotero.selectItems(items);
  27911.         for (var i in items) {
  27912.             ids.push(i);
  27913.         } 
  27914.     } else {
  27915.         ids.push(url.match(/\?(.*)/)[1]);
  27916.     }
  27917.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  27918.     var m = hostRegexp.exec(url);
  27919.     var host = m[1];
  27920.     for (var i in ids) {
  27921.         ids[i] = host+"/full_record.do?" + ids[i];
  27922.     }
  27923.     Zotero.Utilities.processDocuments(ids, function(newDoc) {
  27924.         var url = newDoc.location.href;
  27925.         var sid = newDoc.evaluate(''//input[@name="selectedIds"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  27926.         var nid = newDoc.evaluate(''//input[@name="SID"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  27927.         var post2 = ''product=WOS&product_sid='' + nid + ''&plugin=&product_st_thomas=http://esti.isiknowledge.com:8360/esti/xrpc&export_ref.x=0&export_ref.y=0'';
  27928.         var post = ''action=go&mode=quickOutput&product=WOS&SID='' + nid + ''&format=ref&fields=BibAbs&mark_id=WOS&count_new_items_marked=0&selectedIds='' + sid + ''&qo_fields=bib&endnote.x=95&endnote.y=12&save_options=default'';
  27929.         Zotero.Utilities.HTTP.doPost(''http://apps.isiknowledge.com/OutboundService.do'', post, function() {
  27930.             Zotero.Utilities.HTTP.doPost(''http://pcs.isiknowledge.com/uml/uml_view.cgi'', post2, function(text) {
  27931.                 var lines = text.split("\n");
  27932.                 var field = " ";
  27933.                 var content = " ";
  27934.                 var item = new Zotero.Item("journalArticle");
  27935.                 item.url = url;
  27936.                 var authors;
  27937.                 var fieldRe = /^[A-Z0-9]{2}(?: |$)/;
  27938.  
  27939.                 for each(var line in lines) {
  27940.                     if(line.match(fieldRe)) {
  27941.                         field = line.match(fieldRe)[0].substr(0,2);
  27942.                         content = line.substr(3);
  27943.                         if ((field == "AF" || field == "AU")) {
  27944.                             if (!item.creators[0]) {
  27945.                                 var author = content.split(",");
  27946.                                 item.creators.push({firstName:author[1], lastName:author[0], creatorType:"author"});
  27947.                             } else {
  27948.                                 field = "";
  27949.                             }
  27950.                         } else if (field == "TI") {
  27951.                             item.title = content;
  27952.                         } else if (field == "SO") {
  27953.                             item.publicationTitle = content;
  27954.                         } else if (field == "SN") {
  27955.                             item.ISSN = content;
  27956.                         } else if (field == "PD" || field == "PY") {
  27957.                             if (item.date) {
  27958.                                 item.date += " " + content;
  27959.                             } else {
  27960.                                 item.date = content;
  27961.                             }
  27962.                         } else if (field == "VL") {
  27963.                             item.volume = content;
  27964.                         } else if (field == "IS") {
  27965.                             item.issue = content;
  27966.                         } else if (field == "BP") {
  27967.                             item.pages = content;
  27968.                         } else if (field == "EP") {
  27969.                             item.pages += "-" + content;
  27970.                         } else if (field == "AB") {
  27971.                             item.abstractNote = content;
  27972.                         } else if (field == "DI") {
  27973.                             item.DOI = content;
  27974.                         }
  27975.                     } else {
  27976.                         content = Zotero.Utilities.trimInternal(line);
  27977.                         if (field == "AF" || field == "AU") {
  27978.                             var author = content.split(",");
  27979.                             item.creators.push({firstName:author[1], lastName:author[0], creatorType:"author"});
  27980.                         } else if (field == "TI") {
  27981.                             item.title += " " + content;
  27982.                         } else if (field == "AB") {
  27983.                             item.abstractNote += " " + content;
  27984.                         }
  27985.                     }
  27986.                 }
  27987.                 item.attachments = [{url:item.url, title:"ISI Web of Knowledge Snapshot", mimeType:"text/html"}];
  27988.                 item.complete();
  27989.             });
  27990.         });
  27991.     }, function() {Zotero.done();});
  27992. }');
  27993.  
  27994.  
  27995. REPLACE INTO translators VALUES ('84564450-d633-4de2-bbcc-451ea580f0d6', '1.0.0b3.r1', '', '2007-03-28 20:00:00', '1', '100', '4', 'Gale Literature Resource Center', 'Simon Kornblith', '^https?://[^/]+/servlet/LitRC?(?:|.*&)srchtp=(?:adv)?mla(?:&|$)', 
  27996. 'function detectWeb(doc, url) {
  27997.     var namespace = doc.documentElement.namespaceURI;
  27998.     var nsResolver = namespace ? function(prefix) {
  27999.         if (prefix == ''x'') return namespace; else return null;
  28000.     } : null;
  28001.     
  28002.     if(doc.title.length <= 33 || doc.title.substr(0, 33) != "Literature Resource Center -- MLA") return false;
  28003.     
  28004.     if(url.indexOf("docNum=") != -1) {    // article;
  28005.         return "journalArticle";
  28006.     } else if(doc.evaluate(''//tr[td/span[@class="stndxtralead"]]'', doc, nsResolver,
  28007.        XPathResult.ANY_TYPE, null).iterateNext()) {
  28008.         return "multiple";
  28009.     }
  28010.     
  28011.     return false;
  28012. }', 
  28013. 'function extractCitation(type, citation) {
  28014.     type = Zotero.Utilities.cleanString(type).toLowerCase();
  28015.     citation = Zotero.Utilities.cleanString(citation);
  28016.     
  28017.     if(type == "book article") {
  28018.         var item = new Zotero.Item("bookSection");
  28019.     } else if(type == "book" || type == "book collection") {
  28020.         var item = new Zotero.Item("book");
  28021.     } else if(type == "dissertation abstract") {
  28022.         var item = new Zotero.Item("thesis");
  28023.     } else {
  28024.         var item = new Zotero.Item("journalArticle");
  28025.     }
  28026.     
  28027.     var m;
  28028.     if(item.itemType == "journalArticle" || item.itemType == "thesis") {
  28029.         m = citation.match(/^(.+)\. "([^"]+)" (.+), ([0-9\:]*) ?\(([^\)]+)\)(?:, (?:pp\. ([\-0-9]+)|([\-0-9A-Z]+)))?/);
  28030.         if(!m) return false;
  28031.         
  28032.         item.publicationTitle = m[3];
  28033.         var parts = m[4].split(":");
  28034.         if(parts.length == 2) {
  28035.             item.volume = parts[0];
  28036.             item.issue = parts[1];
  28037.         } else {
  28038.             item.issue = m[4];
  28039.         }
  28040.         item.date = m[5];
  28041.         item.pages = m[6] ? m[6] : m[7];
  28042.     } else if(item.itemType == "book") {
  28043.         m = citation.match(/^(.+)\. "([^"]+)" ([^:]+): ([^,]+), ([0-9]{4})\..*?(?:([0-9]+) pp\.)/);
  28044.         if(!m) return false;
  28045.         
  28046.         item.place = m[3];
  28047.         item.publisher = m[4];
  28048.         item.date = m[5];
  28049.         item.pages = m[6];
  28050.     } else if(item.itemType == "bookSection") {
  28051.         m = citation.match(/^(.+)\. "([^"]+)" pp\. ([\-0-9]+)\. (?:((?:[^\.]*|\([^\)]+\)| [A-Z]\.)*)\.)? ([^\(\)]+). ([^:]+): ([^,]+), ([0-9]{4})/);
  28052.         if(!m) return false;
  28053.         
  28054.         Zotero.debug(m);
  28055.         
  28056.         item.pages = m[3];
  28057.         var bookAuthors = m[4].split(" and ");
  28058.         for each(var bookAuthor in bookAuthors) {
  28059.             var n = bookAuthor.match(/^([^,]+), ([^\(]+)(?: \(([^\)]+)\)?)?$/);
  28060.             if(n) {
  28061.                 var type = (n[3] && n[3].toLowerCase().indexOf("ed.") != -1) ? "editor" : "author";
  28062.                 item.creators.push({lastName:n[1], firstName:n[2], creatorType:type})
  28063.             }
  28064.         }
  28065.         item.publicationTitle = m[5];
  28066.         item.place = m[6];
  28067.         item.publisher = m[7];
  28068.         item.date = m[8];
  28069.     }
  28070.     
  28071.     // add creators
  28072.     var creators = m[1].split("; ");
  28073.     for each(var creator in creators) {
  28074.         item.creators.push(Zotero.Utilities.cleanAuthor(creator, "author", true));
  28075.     }
  28076.     if(m[2][m[2].length-1] == ".") {
  28077.         item.title = m[2].substr(0, m[2].length-1);
  28078.     } else {
  28079.         item.title = m[2];
  28080.     }
  28081.     
  28082.     return item;
  28083. }
  28084.  
  28085. function doWeb(doc, url) {    
  28086.     var namespace = doc.documentElement.namespaceURI;
  28087.     var nsResolver = namespace ? function(prefix) {
  28088.         if (prefix == ''x'') return namespace; else return null;
  28089.     } : null;
  28090.  
  28091.     var uri = doc.location.href;
  28092.     if(url.indexOf("docNum=") != -1) {    // article;
  28093.         var citation = doc.evaluate(''//td[b/text() = "Source Database:"] | //td[*/b/text() = "Source Database:"]'', doc, nsResolver,
  28094.             XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
  28095.         
  28096.         // ugh
  28097.         var parts = citation.split(/<\/CENTER>/i);
  28098.         var citation = parts[parts.length-1];
  28099.         citation = citation.replace(/<script[^>]*>(?:.|[\r\n])*<\/script>/gi, "");
  28100.         citation = citation.replace(/<a[^>]*>(?:.|[\r\n])*<\/a>/gi, "");
  28101.         
  28102.         // big enormous hack, but it works
  28103.         var span = doc.createElement("span");
  28104.         span.innerHTML = citation;
  28105.         citation = span.textContent;
  28106.         
  28107.         var citeM = citation.match(/^\s*([^\n]+)/);
  28108.         var subjectM = citation.match(/Subject Terms:\s+([^\n]+)/);
  28109.         var typeM = citation.match(/Document Type:\s+([^\n]+)/);
  28110.         var issnM = citation.match(/ISSN:\s+([^\n]+)/);
  28111.         
  28112.         var item = extractCitation(typeM[1], citeM[1]);
  28113.         item.tags = subjectM[1].split("; ");
  28114.         
  28115.         if(issnM) item.ISSN = issnM[1];
  28116.         
  28117.         item.complete();
  28118.     } else {                            // search results
  28119.         var items = new Array();
  28120.                 
  28121.         var tableRows = doc.evaluate(''//tr[td/span[@class="stndxtralead"]]'', doc, nsResolver,
  28122.                                      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  28123.         // Go through table rows
  28124.         for(var i=0; i<tableRows.snapshotLength; i++) {
  28125.             items[i] = doc.evaluate(''./td/span[@class="stndxtralead"]//a'', tableRows.snapshotItem(i),
  28126.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28127.             items[i] = items[i].substring(1, items[i].length-1);
  28128.         }
  28129.         
  28130.         items = Zotero.selectItems(items);
  28131.         if(!items) return true
  28132.         
  28133.         for(var i in items) {
  28134.             var tableRow = tableRows.snapshotItem(i);
  28135.             
  28136.             var type = doc.evaluate(''./td[3]/span[@class="stndxtralead"]'', tableRow, nsResolver,
  28137.                 XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28138.             var citation = doc.evaluate(''./td/span[@class="stndxtralead"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28139.             
  28140.             var item = extractCitation(type, citation);
  28141.             if(!item) continue;
  28142.             
  28143.             var terms = doc.evaluate(''.//span[@class="mlasubjects"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  28144.             if(terms) {
  28145.                 // chop off "[Subject Terms: " and "]"
  28146.                 terms = terms.textContent;
  28147.                 terms = terms.substring(16, terms.length-2);
  28148.                 item.tags = terms.split("; ");
  28149.             }
  28150.             
  28151.             item.complete();
  28152.         }
  28153.     }
  28154. }');
  28155.  
  28156. REPLACE INTO translators VALUES ('5eacdb93-20b9-4c46-a89b-523f62935ae4', '1.0.0b3.r1', '', '2008-04-04 20:00:00', '1', '100', '4', 'HighWire', 'Simon Kornblith', '^http://[^/]+/(?:cgi/searchresults|cgi/search|cgi/content/(?:abstract|full|short|summary)|current.dtl$|content/vol[0-9]+/issue[0-9]+/(?:index.dtl)?$)', 
  28157. 'function detectWeb(doc, url) {
  28158.     var namespace = doc.documentElement.namespaceURI;
  28159.     var nsResolver = namespace ? function(prefix) {
  28160.         if (prefix == ''x'') return namespace; else return null;
  28161.     } : null;
  28162.     
  28163.     if(doc.title.indexOf(" -- Search Result") != -1 ||
  28164.       doc.title == "Science/AAAS | Search Results") {
  28165.         if(doc.evaluate(''//table/tbody/tr[td/input[@type="checkbox"][@name="gca"]]'', doc,
  28166.             nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return "multiple";
  28167.     } else if(doc.title.indexOf(" -- Table of Contents") != -1||
  28168.       doc.title == "Science/AAAS | Science Magazine Search Results") {
  28169.         if(doc.evaluate(''//form/dl'', doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext()) return "multiple";
  28170.     } else {
  28171.         if(doc.evaluate(''//a[substring(@href, 1, 16) = "/cgi/citmgr?gca="]'', doc, nsResolver,
  28172.             XPathResult.ANY_TYPE, null).iterateNext()) return "journalArticle";
  28173.     }
  28174.     
  28175.     return false;
  28176. }', 
  28177. 'function handleRequests(requests) {
  28178.     if(requests.length == 0) {
  28179.         Zotero.done();
  28180.         return;
  28181.     }
  28182.     
  28183.     var request = requests.shift();
  28184.     var URL = request.baseURL+request.args;
  28185.     
  28186.     Zotero.Utilities.HTTP.doGet(URL, function(text) {
  28187.         // load translator for RIS
  28188.         var translator = Zotero.loadTranslator("import");
  28189.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  28190.         translator.setString(text);
  28191.         translator.setHandler("itemDone", function(obj, item) {
  28192.             if(item.notes[0]) {
  28193.                 item.DOI = item.notes[0].note;
  28194.                 item.notes = new Array();
  28195.             }
  28196.             
  28197.             item.attachments = new Array();
  28198.             var snapshot = request.snapshots.shift();
  28199.             var pdf = request.pdfs.shift();
  28200.             if(snapshot) {
  28201.                 if(typeof(snapshot) == "string") {
  28202.                     // string snapshot (from search)
  28203.                     item.attachments.push({title:"HighWire Snapshot", mimeType:"text/html", url:snapshot});
  28204.                 } else {
  28205.                     // document object
  28206.                     item.attachments.push({title:"HighWire Snapshot", document:snapshot});
  28207.                 }
  28208.             }
  28209.             if(pdf) {
  28210.                 var m = pdf.match(/^[^?]+/);
  28211.                 item.attachments.push({title:"HighWire Full Text PDF", mimeType:"application/pdf", url:m[0]+".pdf"});
  28212.             }
  28213.             
  28214.             item.complete();
  28215.         });
  28216.         translator.translate();
  28217.         
  28218.         handleRequests(requests);
  28219.     });
  28220. }
  28221.  
  28222. function doWeb(doc, url) {
  28223.     var namespace = doc.documentElement.namespaceURI;
  28224.     var nsResolver = namespace ? function(prefix) {
  28225.         if (prefix == ''x'') return namespace; else return null;
  28226.     } : null;
  28227.     
  28228.     var requests = new Array();
  28229.     var hostRe = /https?:\/\/[^\/]+/;
  28230.     
  28231.     var isSearch = doc.title.indexOf("Search Result") != -1
  28232.     var isTOC = doc.title.indexOf(" -- Table of Contents") != -1;
  28233.     var isScience = doc.title.indexOf("Science Magazine Search Results") != -1;
  28234.     if(isSearch || isTOC) {
  28235.         // search page
  28236.         var items = new Object();
  28237.         var snapshots = new Object();
  28238.         var pdfs = new Object();
  28239.         
  28240.         if(isTOC) {
  28241.             var gcaRe = /^https?:\/\/[^\/]+\/cgi\/reprint\/([0-9]+\/[0-9]+\/[0-9]+)/;
  28242.             var tableRows = doc.evaluate(''//form/dl'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  28243.         } else if(isScience) {
  28244.             var tableRows = doc.evaluate(''//form/dl/dd'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  28245.             var tableDTs = doc.evaluate(''//form/dl/dt'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  28246.         } else {
  28247.             var tableRows = doc.evaluate(''//table/tbody/tr[td/input[@type="checkbox"]][td/font/strong]'', doc,
  28248.                 nsResolver, XPathResult.ANY_TYPE, null);
  28249.         }
  28250.         
  28251.         var tableRow, link;
  28252.         while(tableRow = tableRows.iterateNext()) {
  28253.             var snapshot = undefined;
  28254.             var pdf = undefined;
  28255.             
  28256.             if(isTOC) {
  28257.                 var title = doc.evaluate(''.//strong'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28258.                 
  28259.                 var links = doc.evaluate(''.//a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  28260.                 while(link = links.iterateNext()) {
  28261.                     // prefer Full Text snapshots, but take abstracts
  28262.                     if(link.textContent == "[Abstract]") {
  28263.                         if(!snapshot) snapshot = link.href;
  28264.                     } else if (link.textContent == "[Full Text]") {
  28265.                         snapshot = link.href;
  28266.                     } else if(link.textContent == "[PDF]") {
  28267.                         pdf = link.href;
  28268.                         var m = gcaRe.exec(link.href);
  28269.                         var gca = m[1];
  28270.                     }
  28271.                 }
  28272.             } else {
  28273.                 if(isScience) {
  28274.                     var tableDT = tableDTs.iterateNext();
  28275.                     var gca = doc.evaluate(''./input[@type="checkbox"]'', tableDT, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  28276.                     var title = doc.evaluate(''./label'', tableDT, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28277.                 } else {
  28278.                     var gca = doc.evaluate(''./td/input[@type="checkbox"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  28279.                     var title = doc.evaluate(''./td/font/strong'', tableRow, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  28280.                     if(title.snapshotItem(0).textContent.toUpperCase() == title.snapshotItem(0).textContent) {
  28281.                         title = title.snapshotItem(1).textContent;
  28282.                     } else {
  28283.                         title = title.snapshotItem(0).textContent;
  28284.                     }
  28285.                 }
  28286.                 
  28287.                 var links = doc.evaluate(''.//a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  28288.                 while(link = links.iterateNext()) {
  28289.                     // prefer Full Text snapshots, but take abstracts
  28290.                     var textContent = Zotero.Utilities.cleanString(link.textContent);
  28291.                     if((textContent.substr(0, 8) == "Abstract" && !snapshot) || textContent.substr(0, 9) == "Full Text") {
  28292.                         snapshot = link.href;
  28293.                     } else if(textContent.substr(0, 3) == "PDF") {
  28294.                         pdf = link.href;
  28295.                     }
  28296.                 }
  28297.             }
  28298.             
  28299.             snapshots[gca] = snapshot;
  28300.             pdfs[gca] = pdf;
  28301.             
  28302.             items[gca] = Zotero.Utilities.cleanString(title);
  28303.         }
  28304.         
  28305.         items = Zotero.selectItems(items);
  28306.         if(!items) return true;
  28307.         
  28308.         var requests = new Array();
  28309.         for(var gca in items) {
  28310.             var m = hostRe.exec(pdfs[gca]);
  28311.             var baseURL = ''http://'' + doc.location.host + ''/cgi/citmgr?type=refman'';
  28312.             
  28313.             var thisRequest = null;
  28314.             for each(var request in requests) {
  28315.                 if(request.baseURL == baseURL) {
  28316.                     thisRequest = request;
  28317.                     break;
  28318.                 }
  28319.             }
  28320.             
  28321.             if(!thisRequest) {
  28322.                 thisRequest = new Object();
  28323.                 thisRequest.snapshots = new Array();
  28324.                 thisRequest.pdfs = new Array();
  28325.                 thisRequest.args = "";
  28326.                 thisRequest.baseURL = baseURL;
  28327.                 requests.push(thisRequest);
  28328.             }
  28329.             
  28330.             thisRequest.snapshots.push(snapshots[gca]);
  28331.             thisRequest.pdfs.push(pdfs[gca]);
  28332.             thisRequest.args += "&gca="+gca;
  28333.         }
  28334.     } else {
  28335.         var baseURL = doc.evaluate(''//a[substring(@href, 1, 16) = "/cgi/citmgr?gca="]'', doc, nsResolver,
  28336.             XPathResult.ANY_TYPE, null).iterateNext().href;
  28337.         var pdf = doc.location.href.replace(/\/content\/[^\/]+\//, "/reprint/");
  28338.         Zotero.debug(pdf);
  28339.         var requests = [{baseURL:baseURL, args:"&type=refman", snapshots:[doc], pdfs:[pdf]}];
  28340.     }
  28341.     
  28342.     handleRequests(requests);
  28343.         
  28344.     Zotero.wait();
  28345. }');
  28346.  
  28347.  
  28348. REPLACE INTO translators VALUES ('8c1f42d5-02fa-437b-b2b2-73afc768eb07', '1.0.0b4.r5', '', '2008-12-27 20:50:00', 1, 100, 4, 'PNAS', 'Matt Burton', 'http://www\.pnas\.org/(content|search|cgi/collection/.+)',
  28349. '// This translator is for HighWire 2.0
  28350.  
  28351. function detectWeb(doc, url) {
  28352.     if (url.match("search") || url.match("content/by/section") || doc.title.match("Table of Contents") || doc.title.match("Early Edition") || url.match("cgi/collection/.+")) {
  28353.         return "multiple";
  28354.     } else if (url.match("content/[0-9]")) {
  28355.         return "journalArticle";
  28356.     }
  28357. }',
  28358. 'function doWeb(doc, url) {
  28359.     var arts = new Array();
  28360.     if (detectWeb(doc, url) == "multiple") {
  28361.         var items = new Object();
  28362.         if (doc.title.match("Table of Contents") || doc.title.match("Early Edition")) {
  28363.             var searchx = ''//li[@class = "cit toc-cit" and not(ancestor::div/h2/a/text() = "Correction" or ancestor::div/h2/a/text() = "Corrections")]''; 
  28364.             var titlex = ''.//h4'';
  28365.         } else if (url.match("content/by/section") || url.match("cgi/collection/.+")) {
  28366.             var searchx = ''//li[contains(@class, "results-cit cit")]''; 
  28367.             var titlex = ''.//span[@class = "cit-title"]'';
  28368.         }
  28369.         else {
  28370.             var searchx = ''//div[@class = "results-cit cit"]'';
  28371.             var titlex = ''.//span[@class = "cit-title"]'';
  28372.         }    
  28373.         var linkx = ''.//a[1]'';
  28374.         var searchres = doc.evaluate(searchx, doc, null, XPathResult.ANY_TYPE, null);
  28375.         var next_res;
  28376.         while (next_res = searchres.iterateNext()) {
  28377.             var title = doc.evaluate(titlex, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28378.             var link = doc.evaluate(linkx, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  28379.             items[link] = title;
  28380.         }
  28381.         items = Zotero.selectItems(items);
  28382.         for (var i in items) {
  28383.             arts.push(i);
  28384.         } 
  28385.     } else {
  28386.         arts = [url];
  28387.     }
  28388.     var newurls = new Array();
  28389.     for each (var i in arts) {
  28390.         newurls.push(i);
  28391.     }
  28392.     Zotero.Utilities.HTTP.doGet(arts, function(text) {
  28393.         var id = text.match(/=([^=]+)\">\s*Download to citation manager/)[1];
  28394.         var newurl = newurls.shift();        
  28395.         if (newurl.match("cgi/content")) {
  28396.             var pdfurl = newurl.replace(/cgi\/content\/abstract/, "content") + ".full.pdf";
  28397.         } else {
  28398.             // This is not ideal...todo: brew a regex that grabs the correct URL
  28399.             var pdfurl = newurl.slice(0, newurl.lastIndexOf(".")) + ".full.pdf";
  28400.         }
  28401.         var get = ''http://www.pnas.org/citmgr?type=refman&gca='' + id;
  28402.         Zotero.Utilities.HTTP.doGet(get, function(text) {
  28403.             var translator = Zotero.loadTranslator("import");
  28404.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  28405.             translator.setString(text);
  28406.             if (text.match(/N1(.*)\n/)) {
  28407.                 var doi = text.match(/N1\s+\-\s+(.*)\n/)[1];
  28408.             }
  28409.             translator.setHandler("itemDone", function(obj, item) {
  28410.                 item.attachments = [
  28411.                     {url:newurl, title:"PNAS Snapshot", mimeType:"text/html"},
  28412.                     {url:pdfurl, title:"PNAS Full Text PDF", mimeType:"application/pdf"}
  28413.                 ];
  28414.                 if (doi) item.DOI = doi;
  28415.                 if (item.notes) item.notes = [];
  28416.                 item.complete();
  28417.             });
  28418.             translator.translate();
  28419.         });
  28420.     });
  28421.     Zotero.wait();
  28422. }');
  28423.  
  28424.  
  28425. REPLACE INTO translators VALUES ('a354331-981b-43de-a61-bc26dd1be3a9', '1.0.0b3.r1', '', '2007-03-24 22:20:00', '1', '100', '4', 'AMS MathSciNet', 'Simon Kornblith', '^https?://www\.ams\.org[^/]*/mathscinet/search/(?:publications\.html|publdoc\.html)', 
  28426. 'function detectWeb(doc, url) {
  28427.     var namespace = doc.documentElement.namespaceURI;
  28428.     var nsResolver = namespace ? function(prefix) {
  28429.         if (prefix == ''x'') return namespace; else return null;
  28430.     } : null;
  28431.     
  28432.     var tableRows = doc.evaluate(''//div[@id="content"]/form/div[@class="headline"]'', doc, nsResolver,
  28433.             XPathResult.ANY_TYPE, null);
  28434.     if(tableRows.iterateNext()) {
  28435.         return "multiple"
  28436.     } else if(doc.evaluate(''//div[@id="titleSeparator"]/div[@class="navbar"]/span[@class="PageLink"]/a[text() = "Up"]'',
  28437.         doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  28438.         return "journalArticle";
  28439.     }
  28440.     
  28441.     return false;
  28442. }', 
  28443. 'function doWeb(doc, url) {
  28444.     var namespace = doc.documentElement.namespaceURI;
  28445.     var nsResolver = namespace ? function(prefix) {
  28446.         if (prefix == ''x'') return namespace; else return null;
  28447.     } : null;
  28448.     
  28449.     var pub = "http://www.ams.org/mathscinet/search/publications.html?fmt=bibtex";
  28450.     
  28451.     var tableRows = doc.evaluate(''//div[@id="content"]/form/div[@class="headline"]'', doc, nsResolver,
  28452.             XPathResult.ANY_TYPE, null);
  28453.     var tableRow = tableRows.iterateNext();
  28454.     if(tableRow) {
  28455.         // search page
  28456.         var items = new Object();
  28457.         var links = new Object();
  28458.         
  28459.         do {
  28460.             var id = doc.evaluate(''.//input[@type="checkbox"]'', tableRow, nsResolver,
  28461.                 XPathResult.ANY_TYPE, null).iterateNext().value;
  28462.             items[id] = doc.evaluate(''./div[@class="headlineText"]/span[@class="title"]'', tableRow, nsResolver,
  28463.                 XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28464.             links[id] = doc.evaluate(''.//a'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  28465.                 null).iterateNext().href;
  28466.         } while(tableRow = tableRows.iterateNext())
  28467.         
  28468.         
  28469.         items = Zotero.selectItems(items);
  28470.         if(!items) return true;
  28471.         
  28472.         var docLinks = new Array();
  28473.         for(var id in items) {
  28474.             pub += "&b="+id;
  28475.             docLinks.push(links[id]);
  28476.         }
  28477.     } else {
  28478.         var MR = doc.evaluate(''//div[@id="content"]/div[@class="doc"]/div[@class="headline"]/strong'',
  28479.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28480.         pub += "&b="+MR.replace(/^MR0*/, "");
  28481.     }
  28482.     
  28483.     Zotero.Utilities.HTTP.doGet(pub, function(text) {
  28484.         var m = text.match(/<pre>(?:.|[\r\n])*?<\/pre>/g);
  28485.         var bibTeXString = "";
  28486.         for each(var citation in m) {
  28487.             // kill pre tags
  28488.             citation = citation.substring(5, citation.length-6);
  28489.             bibTeXString += citation;
  28490.         }
  28491.         
  28492.         // import using BibTeX
  28493.         var translator = Zotero.loadTranslator("import");
  28494.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  28495.         translator.setString(bibTeXString);
  28496.         translator.setHandler("itemDone", function(obj, item) {
  28497.             if(docLinks) {
  28498.                 item.attachments.push({title:"MathSciNet Snapshot", url:docLinks.shift(), mimeType:"text/html"});
  28499.             } else {
  28500.                 item.attachments.push({title:"MathSciNet Snapshot", document:doc});
  28501.             }
  28502.             
  28503.             item.complete();
  28504.         });
  28505.         translator.translate();
  28506.         
  28507.         Zotero.done();
  28508.     });
  28509. }');
  28510.  
  28511.  
  28512. REPLACE INTO translators VALUES ('938ebe32-2b2e-4349-a5b3-b3a05d3de627', '1.0.0b3.r1', '', '2009-01-28 18:10:00', 1, 100, 4, 'ACS Publications', 'Sean Takats and Michael Berkowitz and Santawort', 'http://[^/]*pubs3?.acs.org[^/]*/(?:wls/journals/query/(?:subscriberResults|query)\.html|acs/journals/toc.page|cgi-bin/(?:article|abstract|sample|asap).cgi)?',
  28513. 'function detectWeb(doc, url) {
  28514.     var namespace = doc.documentElement.namespaceURI;
  28515.     var nsResolver = namespace ? function(prefix) {
  28516.         if (prefix == ''x'') return namespace; else return null;
  28517.     } : null;
  28518.  
  28519.     if(doc.evaluate(''//input[@id="articleListHeader_selectAllToc"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  28520.         Zotero.debug("multiple");
  28521.         return "multiple";
  28522.     } else if (doc.evaluate(''//div[@id="articleHead"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  28523.         return "journalArticle";
  28524.     }
  28525.     return false;
  28526. }',
  28527. 'function doWeb(doc, url){
  28528.     var namespace = doc.documentElement.namespaceURI;
  28529.     var nsResolver = namespace ? function(prefix) {
  28530.         if (prefix == ''x'') return namespace; else return null;
  28531.     } : null;
  28532.     var host = ''http://'' + doc.location.host + "/";
  28533.     //Zotero.debug(host);
  28534.     var m = url.match(/https?:\/\/[^\/]*\/doi\/(abs|full)\/(.+)/);
  28535.     var dois = new Array();
  28536.     if(detectWeb(doc, url) == "multiple") { //search
  28537.         var doi;
  28538.         var title;
  28539.         var availableItems = new Array();
  28540.         var xpath = ''//div[@class="articleBox"]'';
  28541.         if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  28542.             elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  28543.             var elmt = elmts.iterateNext();
  28544.             do {
  28545.                 title = doc.evaluate(''./div[@class="articleBoxMeta"]/h2'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28546.                 doi = doc.evaluate(''./div[@class="articleBoxMeta"]/h2/a/@href'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("/doi/abs/","");
  28547.                 if (doi.indexOf("prevSearch") != -1){
  28548.                     doi = doi.substring(0,doi.indexOf("?"));
  28549.                 }
  28550.                 availableItems[doi] = title;
  28551.             } while (elmt = elmts.iterateNext())
  28552.         }
  28553.         var items = Zotero.selectItems(availableItems);
  28554.         if(!items) {
  28555.             return true;
  28556.         }
  28557.         for(var i in items) {
  28558.             dois.push(i);
  28559.         }
  28560.     } else if (m){ //single article
  28561.         var doi = m[2];
  28562.         if (doi.match("prevSearch")) {
  28563.             doi = doi.substring(0,doi.indexOf("?"));
  28564.         }
  28565.         Zotero.debug("DOI= "+doi);
  28566.         dois.push(doi);
  28567.     }
  28568.     
  28569.     var setupSets = [];
  28570.     for each (doi in dois) {
  28571.         var citUrl = host + ''action/showCitFormats?doi='' + doi;
  28572.         setupSets.push({ doi: doi, citUrl: citUrl });
  28573.     }
  28574.     
  28575.     var setupCallback = function () {
  28576.         //get citation export page''s source code;
  28577.         if (setupSets.length) {
  28578.             var set = setupSets.shift();
  28579.             Zotero.Utilities.HTTP.doGet(set.citUrl, function(text){
  28580.                 //get the exported RIS file name;
  28581.                 var downloadFileName = text.match(/name=\"downloadFileName\" value=\"([A-Za-z0-9_]+)\"/)[1];
  28582.                 Zotero.debug("downloadfilename= "+downloadFileName);
  28583.                 processCallback(set.doi,downloadFileName);
  28584.             });
  28585.         }
  28586.         else {
  28587.             Zotero.done();
  28588.         }
  28589.     }
  28590.     var processCallback = function (doi,downloadFileName) {
  28591.         var baseurl = "http://pubs.acs.org/action/downloadCitation";
  28592.         var post = "doi=" + doi + "&downloadFileName=" + downloadFileName + "&include=abs&format=refman&direct=on&submit=Download+article+citation+data";
  28593.         Zotero.Utilities.HTTP.doPost(baseurl, post,function(text){
  28594.             // Fix the RIS doi mapping
  28595.             text = text.replace("N1  - doi:","M3  - ");
  28596.             Zotero.debug("ris= "+ text);
  28597.             var translator = Zotero.loadTranslator("import");
  28598.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  28599.             translator.setString(text);
  28600.             translator.setHandler("itemDone", function(obj, item) {
  28601.                 var pdfUrl = host + ''doi/pdf/'' + doi;
  28602.                 var fullTextUrl = host + ''doi/full/'' + doi;
  28603.                 item.attachments.push(
  28604.                     {title:"ACS Full Text PDF",url:pdfUrl, mimeType:"application/pdf"},
  28605.                     {title:"ACS Full Text Snapshot",url:fullTextUrl, mimeType:"text/html"}
  28606.                 );
  28607.                 item.complete();
  28608.             });
  28609.             translator.translate();
  28610.             setupCallback();
  28611.         });
  28612.     }
  28613.     setupCallback();
  28614.     Zotero.wait();
  28615. }');
  28616.  
  28617.  
  28618. REPLACE INTO translators VALUES ('72cb2536-3211-41e0-ae8b-974c0385e085', '1.0.0b4.r1', '', '2008-06-12 19:30:00', '0', '100', '4', 'ARTFL Encyclopedie', 'Sean Takats', '/cgi-bin/philologic31/(getobject\.pl\?c\.[0-9]+:[0-9]+\.encyclopedie|search3t\?dbname=encyclopedie0507)', 
  28619. 'function detectWeb(doc, url) {
  28620.     if (url.indexOf("getobject.pl") != -1){
  28621.         return "encyclopediaArticle";
  28622.     } else {
  28623.         return "multiple";
  28624.     }
  28625. }', 
  28626. 'function reconcileAuthor(author){
  28627.     var authorMap = {
  28628.         "Venel":"Venel, Gabriel-Fran├ºois",
  28629.         "d''Aumont":"d''Aumont, Arnulphe",
  28630.         "de La Chapelle":"de La Chapelle, Jean-Baptiste",
  28631.         "Bourgelat":"Bourgelat, Claude",
  28632.         "Dumarsais":"Du Marsais, C├⌐sar Chesneau",
  28633.         "Mallet":"Mallet, Edme-Fran├ºois",
  28634.         "Toussaint":"Toussaint, Fran├ºois-Vincent",
  28635.         "Daubenton":"Daubenton, Louis-Jean-Marie",
  28636.         "d''Argenville": "d''Argenville, Antoine-Joseph Desallier",
  28637.         "Tarin":"Tarin, Pierre",
  28638.         "Vandenesse":"de Vandenesse, Urbain",
  28639.         "Blondel": "Blondel, Jacques-Fran├ºois",
  28640.         "Le Blond":"Le Blond, Guillaume",
  28641.         "Rousseau":"Rousseau, Jean-Jacques",
  28642.         "Eidous":"Eidous, Marc-Antoine",
  28643.         "d''Alembert":"d''Alembert, Jean le Rond",
  28644.         "Louis":"Louis, Antoine",
  28645.         "Bellin":"Bellin, Jacques-Nicolas",
  28646.         "Diderot":"Diderot, Denis",
  28647.         "Diderot1":"Diderot, Denis",
  28648.         "Diderot2":"Diderot, Denis",
  28649.         "de Jaucourt":"de Jaucourt, Chevalier Louis",
  28650.         "Jaucourt":"de Jaucourt, Chevalier Louis",
  28651.         "d''Holbach":"d''Holbach, Baron"
  28652.         /* not yet mapped
  28653.         Yvon
  28654.         Forbonnais
  28655.         Douchet and Beauz├⌐e
  28656.         Boucher d''Argis
  28657.         Lenglet Du Fresnoy
  28658.         Cahusac
  28659.         Pestr├⌐
  28660.         Daubenton, le Subd├⌐l├⌐gu├⌐
  28661.         Goussier
  28662.         de Villiers
  28663.         Barth├¿s
  28664.         Morellet
  28665.         Malouin
  28666.         M├⌐nuret de Chambaud
  28667.         Landois
  28668.         Le Roy
  28669.         */
  28670.     }
  28671.     if(authorMap[author]) {
  28672.         author = authorMap[author];
  28673.     }
  28674.     // remove ARTFL''s trailing 5 for odd contributors (e.g. Turgot5)
  28675.         if (author.substr(author.length-1, 1)=="5"){
  28676.         author = author.substr(0, author.length-1);
  28677.     }
  28678.     return author;
  28679. }
  28680.  
  28681. function scrape (doc){
  28682.     var namespace = doc.documentElement.namespaceURI;
  28683.     var nsResolver = namespace ? function(prefix) {
  28684.         if (prefix == ''x'') return namespace; else return null;
  28685.         } : null;
  28686.         var url = doc.location.href;
  28687.         var newItem = new Zotero.Item("encyclopediaArticle");
  28688.         var xpath = ''/html/body/div[@class="text"]/font'';
  28689.         var titleElmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  28690.         if (titleElmt) {
  28691.             var title = titleElmt.textContent;
  28692.         } else {
  28693.             xpath = ''/html/body/div[@class="text"]/b'';
  28694.             var title = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28695.         }
  28696.         newItem.title = title;
  28697.         newItem.encyclopediaTitle = "Encyclop├⌐die, ou Dictionnaire raisonn├⌐ des sciences, des arts et des m├⌐tiers";
  28698.         newItem.shortTitle = "Encyclop├⌐die";
  28699.         newItem.date = "1751-1772";
  28700.         newItem.publisher = "Briasson";
  28701.         newItem.place = "Paris";
  28702.         newItem.url = url;
  28703.     
  28704.         newItem.attachments.push({title:"ARTFL Snapshot", mimeType:"text/html", url:url, snapshot:true});
  28705.     
  28706.         // get author and tags
  28707.         var hostRegexp = new RegExp("^(https?://[^/]+)/");
  28708.         var hMatch = hostRegexp.exec(url);
  28709.         var host = hMatch[1];
  28710.         var getString1 = "/cgi-bin/philologic31/search3t?dbname=encyclopedie0507&word=&dgdivhead=";
  28711.         var getString2 = "&dgdivocauthor=&dgdivocplacename=&dgdivocsalutation=&dgdivocclassification=&dgdivocpartofspeech=&dgdivtype=&CONJUNCT=PHRASE&DISTANCE=3&PROXY=or+fewer&OUTPUT=conc&POLESPAN=5&KWSS=1&KWSSPRLIM=500";
  28712.         
  28713.         Zotero.Utilities.HTTP.doGet(host+getString1+title+getString2, function(text){
  28714.             var tagRe = new RegExp(''>''+title+''</a>[^\[]*\\[([^\\]]*)\]'', ''i'');
  28715.             var m = tagRe.exec(text);
  28716.             if(m[1] != "unclassified"){
  28717.                  var tagstring = m[1].replace("&", "&", "g");
  28718.                 var tags = tagstring.split(";")
  28719.                 for(var j in tags) {
  28720.                     newItem.tags.push(Zotero.Utilities.cleanString(tags[j]));
  28721.                 }
  28722.             }
  28723.             var authorRe = new RegExp(''>''+title+''</a>,([^,]*),'', "i");
  28724.             var m = authorRe.exec(text);
  28725.             var author = m[1];
  28726.             author = Zotero.Utilities.cleanString(author);
  28727.             // reconcile author
  28728.             author = reconcileAuthor(author);    
  28729.             if (author!="NA"){ // ignore unknown authors
  28730.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true));
  28731.             }
  28732.             newItem.creators.push({firstName:"Denis", lastName:"Diderot", creatorType:"editor"});
  28733.             newItem.creators.push({firstName:"Jean le Rond", lastName:"d''Alembert", creatorType:"editor"});
  28734.             newItem.complete();
  28735.         }, function() {Zotero.done();}, null);
  28736.         Zotero.wait();    
  28737. }
  28738.  
  28739. function doWeb(doc, url) {
  28740.     var namespace = doc.documentElement.namespaceURI;
  28741.     var nsResolver = namespace ? function(prefix) {
  28742.         if (prefix == ''x'') return namespace; else return null;
  28743.         } : null;
  28744.  
  28745.     if (url.indexOf("getobject.pl") != -1){
  28746.         // single article
  28747.         scrape(doc);                
  28748.     } else {
  28749.         //search page
  28750.         var items = new Object();
  28751.         var xpath = ''/html/body/div[@class="text"]/p/a'';
  28752.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  28753.         var elmt;        
  28754.         while (elmt = elmts.iterateNext()){
  28755.             var title = elmt.textContent;
  28756.             var link = elmt.href;
  28757.             if (title && link){
  28758.                 items[link] = title;
  28759.             }            
  28760.         }
  28761.         var items = Zotero.selectItems(items);
  28762.         if(!items) {
  28763.             return true;
  28764.         }
  28765.         var urls = new Array();
  28766.         for(var i in items) {
  28767.             urls.push(i);
  28768.         }
  28769.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  28770.         Zotero.wait();    
  28771.     }
  28772.         
  28773. }');
  28774.  
  28775. REPLACE INTO translators VALUES ('1b9ed730-69c7-40b0-8a06-517a89a3a278', '1.0.0b3.r1', '', '2009-04-28 09:15:00', 1, 100, 4, 'Sudoc', 'Sean Takats and Michael Berkowitz, updated by Sylvain Machefert', '^http://www\.sudoc\.abes\.fr',
  28776. 'function detectWeb(doc, url) {
  28777.         var namespace = doc.documentElement.namespaceURI;
  28778.         var nsResolver = namespace ? function(prefix) {
  28779.                 if (prefix == ''x'') return namespace; else return null;
  28780.         } : null;
  28781.  
  28782.         var multxpath = ''/html/body/div[2]/div/span'';
  28783.         if (elt = doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  28784.                 var content = elt.textContent;
  28785.                 if ( (content == "R├⌐sultats") || (content == "Results") )
  28786.                 {
  28787.                     return "multiple";    
  28788.                 }
  28789.                 else if ( (content == "Notice compl├¿te") || (content == "title data") )
  28790.                 {
  28791.                     var xpathimage = ''/html/body/div[2]/div[4]/span/img'';
  28792.                     if (elt = doc.evaluate(xpathimage, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  28793.                     {
  28794.                         var type = elt.getAttribute(''src'');
  28795.                         if (type.indexOf(''article.gif'') > 0)
  28796.                         {
  28797.                             return "journalArticle";
  28798.                         }
  28799.                         else if (type.indexOf(''book.gif'') > 0)
  28800.                         {
  28801.                             return "book";
  28802.                         }
  28803.                         else if (type.indexOf(''handwriting.gif'') > 0)
  28804.                         {
  28805.                             return "manuscript";
  28806.                         }
  28807.                         else if (type.indexOf(''sons.gif'') > 0)
  28808.                         {
  28809.                             return "audioRecording";
  28810.                         }
  28811.                         else if (type.indexOf(''sound.gif'') > 0)
  28812.                         {
  28813.                             return "audioRecording";
  28814.                         }
  28815.                         else if (type.indexOf(''thesis.gif'') > 0)
  28816.                         {
  28817.                             return "thesis";
  28818.                         }
  28819.                         else if (type.indexOf(''map.gif'') > 0)
  28820.                         {
  28821.                             return "map";
  28822.                         }
  28823.                         else
  28824.                         {
  28825.                             return "book";
  28826.                         }
  28827.                     }
  28828.                 }
  28829.         }
  28830. }',
  28831.  
  28832. 'function scrape(doc) {
  28833.         var namespace = doc.documentElement.namespaceURI;
  28834.         var nsResolver = namespace ? function(prefix) {
  28835.                 if (prefix == ''x'') return namespace; else return null;
  28836.         } : null;
  28837.         
  28838.         var zXpath = ''/html/body/span[@class="Z3988"]'';
  28839.         var eltCoins = doc.evaluate(zXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  28840.         if (eltCoins = doc.evaluate(zXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  28841.         {
  28842.             var coins = eltCoins.getAttribute(''title'');
  28843.  
  28844.             var newItem = new Zotero.Item();
  28845.             newItem.repository = false;    // do not save repository
  28846.             if(Zotero.Utilities.parseContextObject(coins, newItem)) 
  28847.             {
  28848.                 if (newItem.title) 
  28849.                 {
  28850.                     // We use the same method as in detectWeb to find 
  28851.                     // the real type of document
  28852.                     var xpathimage = ''/html/body/div[2]/div[4]/span/img'';
  28853.                     if (elt = doc.evaluate(xpathimage, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  28854.                     {
  28855.                         var type = elt.getAttribute(''src'');
  28856.                         var ZoteroType = '''';
  28857.                         if (type.indexOf(''article.gif'') > 0)
  28858.                         {
  28859.                             zoteroType = ''journalArticle'';
  28860.                         }
  28861.                         else if (type.indexOf(''book.gif'') > 0)
  28862.                         {
  28863.                             zoteroType = ''book'';
  28864.                         }
  28865.                         else if (type.indexOf(''handwriting.gif'') > 0)
  28866.                         {
  28867.                             zoteroType = ''manuscript'';
  28868.                         }
  28869.                         else if (type.indexOf(''sons.gif'') > 0)
  28870.                         {
  28871.                             zoteroType = "audioRecording";
  28872.                         }
  28873.                         else if (type.indexOf(''sound.gif'') > 0)
  28874.                         {
  28875.                             zoteroType = "audioRecording";
  28876.                         }
  28877.                         else if (type.indexOf(''thesis.gif'') > 0)
  28878.                         {
  28879.                             zoteroType = "thesis";
  28880.                         }
  28881.                         else if (type.indexOf(''map.gif'') > 0)
  28882.                         {
  28883.                             zoteroType = "map";
  28884.                         }
  28885.                         else
  28886.                         {
  28887.                             zoteroType = "book";
  28888.                         }
  28889.                         newItem.itemType = zoteroType;
  28890.                     }
  28891.                     
  28892.                     //     We need to correct some informations where COinS is wrong
  28893.                     var rowXpath = ''//tr[td[@class="rec_lable"]]'';
  28894.                     var tableRows = doc.evaluate(rowXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  28895.                     var tableRow;
  28896.                     
  28897.                     while (tableRow = tableRows.iterateNext())
  28898.                     {
  28899.                         var field = doc.evaluate(''./td[1]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28900.                         var value = doc.evaluate(''./td[2]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  28901.                         field = Zotero.Utilities.superCleanString(field);
  28902.                         field = field.replace(/(\(s\))?\s*:\s*$/, "");
  28903.  
  28904.                         // With COins, only one author is taken, changed.
  28905.                         if (field.substr(0,6) == "Auteur" || field.substr(0,6) == "Author")
  28906.                         {
  28907.                             var authors = doc.evaluate(''./td[2]/div'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  28908.                             newItem.creators = new Array();
  28909.                             while (author = authors.iterateNext())
  28910.                             {
  28911.                                 var authorText = author.textContent;
  28912.                                 
  28913.                                 authorFunction = authorText.split(". ")[1];
  28914.                                 authorText = authorText.split(". ")[0];
  28915.                                 if (authorFunction)
  28916.                                 {
  28917.                                     authorFunction = Zotero.Utilities.superCleanString(authorFunction);
  28918.                                 }
  28919.                                 var zoteroFunction = '''';
  28920.                                 // TODO : Add other authotiry types
  28921.                                 if (authorFunction == ''Traduction'')
  28922.                                 {
  28923.                                     zoteroFunction = ''Translator'';
  28924.                                 }
  28925.                                 else
  28926.                                 {
  28927.                                     zoteroFunction = ''Author'';
  28928.                                 }
  28929.                                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authorText, zoteroFunction, true));
  28930.                             }
  28931.                         }
  28932.                         // The serie isn''t in COinS
  28933.                         else     if (field.substr(0,5) == "Serie" || field.substr(0,10) == "Collection")
  28934.                         {
  28935.                             newItem.series = value;    
  28936.                         }
  28937.                         // When there''s a subtitle, only main title is used !
  28938.                         else if (field == "Titre" || field == "Title")
  28939.                         {
  28940.                             var title = '''';
  28941.                             var titles = doc.evaluate(''./td[2]/div/span'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  28942.                             while (partTitle = titles.iterateNext())
  28943.                             {
  28944.                                 partTitle = partTitle.textContent;
  28945.                                 partTitle = partTitle.replace(/(\[[^\]]+\] ?)/g,"");
  28946.                                 title = title + partTitle;
  28947.                             }
  28948.                             // Remove the author
  28949.                             title = title.split(" / ")[0];
  28950.                             newItem.title = title;
  28951.                         }
  28952.                         // Language not defined in COinS
  28953.                         else if ( (field == "Langue") || (field == "Language") )
  28954.                         {
  28955.                             newItem.language = value;
  28956.                         }
  28957.                         else if ( (field == "R├⌐sum├⌐") || (field == "Abstract") )
  28958.                         {
  28959.                             if (newItem.abstractNote)
  28960.                             {
  28961.                                 newItem.abstractNote = newItem.abstractNote + " " + value;
  28962.                             }
  28963.                             else
  28964.                             {
  28965.                                 newItem.abstractNote = value;
  28966.                             }
  28967.  
  28968.                         }
  28969.                         else if (field == "Notes")
  28970.                         {
  28971.                             if (newItem.abstractNote)
  28972.                             {
  28973.                                 newItem.abstractNote = newItem.abstractNote + " " + value;
  28974.                             }
  28975.                             else
  28976.                             {
  28977.                                 newItem.abstractNote = value;
  28978.                             }
  28979.                         }
  28980.                     }
  28981.                     newItem.complete();
  28982.                 }
  28983.             }
  28984.         }
  28985. }
  28986.  
  28987. function doWeb(doc, url) {
  28988.         var namespace = doc.documentElement.namespaceURI;
  28989.         var nsResolver = namespace ? function(prefix) {
  28990.                 if (prefix == ''x'') return namespace; else return null;
  28991.         } : null;
  28992.         
  28993.         var multxpath = ''/html/body/div[2]/div/span'';
  28994.         if (elt = doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  28995.                 var content = elt.textContent;
  28996.                 if ( (content == "R├⌐sultats") || (content == "Results") )
  28997.                 {
  28998.                     var newUrl = doc.evaluate(''//base/@href'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  28999.                     var xpath = ''/html/body/div[2]/table/tbody/tr/td[3]/div/a'';
  29000.                     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  29001.                     var elmt = elmts.iterateNext();
  29002.                     var links = new Array();
  29003.                     var availableItems = new Array();
  29004.                     var i = 0;
  29005.                     do {
  29006.                         var link = doc.evaluate(''./@href'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  29007.                         var searchTitle = elmt.textContent;
  29008.                         availableItems[i] = searchTitle;
  29009.                         links[i] = link;
  29010.                         i++;
  29011.                     } while (elmt = elmts.iterateNext());
  29012.                     var items = Zotero.selectItems(availableItems);
  29013.  
  29014.                     if(!items) {
  29015.                         return true;
  29016.                     }
  29017.                     
  29018.                     var uris = new Array();
  29019.                     for(var i in items) {
  29020.                             uris.push(newUrl + links[i]);
  29021.                             Zotero.debug(newUrl + links[i]);
  29022.                     }
  29023.                     Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  29024.                             function() { Zotero.done(); }, null);
  29025.                     Zotero.wait();        
  29026.                 }
  29027.                 else if ( (content == "Notice compl├¿te") || (content == ''title data'') )
  29028.                 {
  29029.                     scrape(doc);
  29030.                 }
  29031.         }
  29032. }');
  29033.  
  29034.  
  29035. REPLACE INTO translators VALUES ('66928fe3-1e93-45a7-8e11-9df6de0a11b3', '1.0.0b3.r1', '', '2007-03-22 16:35:00', '0', '100', '4', 'Max Planck Institute for the History of Science: Virtual Laboratory Library', 'Sean Takats', 'http://vlp.mpiwg-berlin.mpg.de/library/', 
  29036. 'function detectWeb(doc, url){
  29037.     var namespace = doc.documentElement.namespaceURI;
  29038.         var nsResolver = namespace ? function(prefix) {
  29039.                 if (prefix == ''x'') return namespace; else return null;
  29040.         } : null;
  29041.     var elmt = doc.evaluate(''//base[contains(@href, "/library/data/lit")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  29042.     if (elmt){
  29043.             return "book";
  29044.     }
  29045.     elmt = doc.evaluate(''//span[starts-with(@title, "lit")] | //a[starts-with(@title, "lit")] | //p[starts-with(@title, "lit")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  29046.     if (elmt){
  29047.         return "multiple";
  29048.     }
  29049. }', 
  29050. 'function doWeb(doc, url){
  29051.  
  29052.     var namespace = doc.documentElement.namespaceURI;
  29053.         var nsResolver = namespace ? function(prefix) {
  29054.                 if (prefix == ''x'') return namespace; else return null;
  29055.         } : null;
  29056.     var uris = new Array();
  29057.     var baseElmt = doc.evaluate(''//base[contains(@href, "/library/data/lit")]/@href'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  29058.     if (baseElmt){
  29059.         var docID = baseElmt.nodeValue;
  29060.         var idRe = /lit[0-9]+/;
  29061.         var m = idRe.exec(docID);
  29062.         uris.push("http://vlp.mpiwg-berlin.mpg.de/library/meta?id=" + m[0]);
  29063.     } else {
  29064.         var searchElmts = doc.evaluate(''//span[starts-with(@title, "lit")] | //a[starts-with(@title, "lit")] | //p[starts-with(@title, "lit")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  29065.         var searchElmt;
  29066.         var links = new Array();
  29067.         var availableItems = new Array();
  29068.         var i = 0;
  29069.         while (searchElmt = searchElmts.iterateNext()){
  29070.             availableItems[i] = Zotero.Utilities.cleanString(searchElmt.textContent);
  29071.             var docID = doc.evaluate(''./@title'', searchElmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  29072.             links.push("http://vlp.mpiwg-berlin.mpg.de/library/meta?id=" + docID);
  29073.             i++;
  29074.         }
  29075.         var items = Zotero.selectItems(availableItems);
  29076.         if(!items) {
  29077.             return true;
  29078.         }
  29079.         var uris = new Array();
  29080.         for(var i in items) {
  29081.             uris.push(links[i]);
  29082.         }
  29083.     }
  29084.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  29085.         // load Refer translator
  29086.         var translator = Zotero.loadTranslator("import");
  29087.         translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  29088.         translator.setString(text);
  29089.         translator.setHandler("itemDone", function(obj, item) {
  29090.             item.type = undefined;
  29091.             item.complete();
  29092.         });
  29093.         translator.translate();
  29094.     }, function() {Zotero.done();}, null);
  29095.     Zotero.wait();
  29096. }');
  29097.  
  29098.  
  29099. REPLACE INTO translators VALUES ('0507797c-9bc4-4374-92ca-9e3763b6922b', '1.0.0b4.r5', '', '2008-05-06 08:15:00', '0', '100', '4', 'World History Connected', 'Frederick Gibbs', 'worldhistoryconnected\.press|historycooperative.*/whc/', '', 
  29100. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  29101.     var field = metaTags.namedItem(field);
  29102.     if(field) {
  29103.         newItem[zoteroField] = field.getAttribute("content");
  29104.     }
  29105. }
  29106.  
  29107. function scrape(doc) {
  29108.     
  29109.     var namespace = doc.documentElement.namespaceURI;
  29110.     var nsResolver = namespace ? function(prefix) {
  29111.         if (prefix == ''x'') return namespace; else return null;
  29112.     } : null;
  29113.     
  29114.     var newItem = new Zotero.Item("journalArticle");
  29115.     newItem.url = doc.location.href;
  29116.     
  29117.     var titlePath;
  29118.     var bookTitle;
  29119.     var month, year;
  29120.     var metaTags = doc.getElementsByTagName("meta");
  29121.  
  29122.     associateMeta(newItem, metaTags, "Journal", "publicationTitle");
  29123.     associateMeta(newItem, metaTags, "Volume", "volume");
  29124.     associateMeta(newItem, metaTags, "Issue", "issue");
  29125.  
  29126.     // in the case of book reviews, the title field is blank
  29127.     //but quotes are not escaped properly, so if an article title begins with quotes, then the title tag looks blank even though it is not.
  29128.     //(though semantically it is)
  29129.     //they use the meta tag ''FileType'' to indicate Aritlce or Book Review. silly, but we can use it.
  29130.     
  29131.     if (metaTags.namedItem(''FileType'').getAttribute("content") == ''Book Review'') {
  29132.         //for a book review, title of reviewed book is
  29133.         titlePath = ''/html/body/table[4]/tbody/tr[3]/td[1]/i'';    
  29134.         newItem.title = "Review of " + doc.evaluate(titlePath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  29135.  
  29136.     } else {
  29137.         //it would be nice to grab the title from the meta tags, but quotations are properly escaped and the tags are therefore malformed.
  29138.         titlePath = ''/html/body/table[4]/tbody/tr[2]/td[1]/h2/font/b'';
  29139.         newItem.title = Zotero.Utilities.superCleanString(doc.evaluate(titlePath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  29140.     }
  29141.  
  29142.     var author = metaTags.namedItem("Author");
  29143.     if(author) {
  29144.         var authors = author.getAttribute("content").split(" and ");
  29145.         for(j in authors) {
  29146.             authors[j] = authors[j].replace("Reviewed by ", "");
  29147.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
  29148.         }
  29149.     }
  29150.     
  29151.     var month = metaTags.namedItem("PublicationMonth");
  29152.     var year = metaTags.namedItem("PublicationYear");
  29153.     if(month && year) {
  29154.         newItem.date = month.getAttribute("content")+" "+year.getAttribute("content");
  29155.     }
  29156.     
  29157.     newItem.attachments.push({document:doc, title:"World History Connected Snapshot"});
  29158.     
  29159.     newItem.complete();
  29160. }
  29161.  
  29162. function doWeb(doc, url) {
  29163.     
  29164.     var searchLinks;
  29165.     
  29166.     var namespace = doc.documentElement.namespaceURI;
  29167.     var nsResolver = namespace ? function(prefix) {
  29168.         if (prefix == ''x'') return namespace; else return null;
  29169.     } : null;
  29170.  
  29171.     if(doc.title.indexOf("Contents") != -1 || doc.title.indexOf("Search results") != -1) {
  29172.  
  29173.         if(doc.title.indexOf("Contents") != -1) {
  29174.         searchLinks = doc.evaluate(''//tbody/tr[2]/td[1]/table/tbody/tr/td/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);    
  29175.         } 
  29176.         else if ( doc.title.indexOf("Search results") != -1) {
  29177.         searchLinks = doc.evaluate(''/html/body/dl/dt/strong/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  29178.         }
  29179.         
  29180.         var link;
  29181.         var title;
  29182.         var items = new Object();
  29183.         
  29184.         while (elmt = searchLinks.iterateNext()) {
  29185.             Zotero.debug(elmt.href);
  29186.             title = Zotero.Utilities.superCleanString(elmt.textContent);
  29187.             link = elmt.href;
  29188.             if (title && link){
  29189.                 items[link] = title;
  29190.             }
  29191.         }
  29192.     
  29193.         items = Zotero.selectItems(items);
  29194.         
  29195.         if(!items) {
  29196.             return true;
  29197.         }
  29198.         
  29199.         var uris = new Array();
  29200.         for(var i in items) {
  29201.             uris.push(i);
  29202.         }
  29203.         
  29204.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  29205.             function() { Zotero.done(); }, null);
  29206.         
  29207.         Zotero.wait();
  29208.     } else {
  29209.         scrape(doc);
  29210.     }
  29211. }');
  29212.  
  29213. REPLACE INTO translators VALUES ('c73a4a8c-3ef1-4ec8-8229-7531ee384cc4', '1.0.0b3.r1', '', '2007-11-05 18:00:00', '1', '100', '4', 'Open WorldCat (Web)', 'Sean Takats', '^http://(?:www\.)?worldcat\.org/(?:search\?|profiles/[^/]+/lists/)', 
  29214. 'function detectWeb(doc, url){
  29215.     var nsResolver = doc.createNSResolver(doc.documentElement);
  29216.  
  29217.     var xpath = ''//table[@class="tableResults" or @class="table-results"]/tbody/tr/td[3][@class="result"]/div[@class="name"]/a/strong'';
  29218.     var results = doc.evaluate(xpath, doc,
  29219.                    nsResolver, XPathResult.ANY_TYPE, null);
  29220.     if(results.iterateNext()) {
  29221.         return "multiple";
  29222.     }
  29223. }', 
  29224. 'function processOWC(doc) {
  29225.     var spanTags = doc.getElementsByTagName("span");
  29226.     for(var i=0; i<spanTags.length; i++) {
  29227.         var spanClass = spanTags[i].getAttribute("class");
  29228.         if(spanClass) {
  29229.             var spanClasses = spanClass.split(" ");
  29230.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  29231.                 var spanTitle = spanTags[i].getAttribute("title");
  29232.                 var item = new Zotero.Item();
  29233.                 if(Zotero.Utilities.parseContextObject(spanTitle, item)) {
  29234.                     if(item.title) {
  29235.                         item.title = Zotero.Utilities.capitalizeTitle(item.title);
  29236.                     } else {
  29237.                         item.title = "[Untitled]";
  29238.                     }
  29239.                     
  29240.                     item.complete();
  29241.                     return true;
  29242.                 } else {
  29243.                     return false;
  29244.                 }
  29245.             }
  29246.         }
  29247.     }
  29248.     
  29249.     return false;
  29250. }
  29251.  
  29252. function doWeb(doc, url){
  29253.     var nsResolver = doc.createNSResolver(doc.documentElement);
  29254.  
  29255.     var urls = new Array();
  29256.     var items = new Array();
  29257.     var xpath = ''//table[@class="tableResults" or @class="table-results"]/tbody/tr/td[3][@class="result"]/div[@class="name"]/a'';
  29258.     var titles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  29259.     var title;
  29260.     // Go through titles
  29261.     while(title = titles.iterateNext()) {
  29262.         items[title.href] = title.textContent;
  29263.     }
  29264.  
  29265.     items = Zotero.selectItems(items);
  29266.  
  29267.     if(!items) {
  29268.         return true;
  29269.     }
  29270.  
  29271.     for(var i in items) {
  29272.         urls.push(i);
  29273.     }
  29274.  
  29275.     Zotero.Utilities.processDocuments(urls, function(doc) {
  29276.         processOWC(doc);}, function() {Zotero.done();});
  29277.     Zotero.wait();
  29278. }');
  29279.  
  29280. REPLACE INTO translators VALUES ('e07e9b8c-0e98-4915-bb5a-32a08cb2f365', '1.0.0b3.r1', '', '2007-03-22 18:15:00', 1, 100, 12, 'Open WorldCat (Search)', 'Simon Kornblith', 'http://partneraccess.oclc.org/',
  29281. 'function detectSearch(item) {
  29282.     if(item.itemType == "book" || item.itemType == "bookSection") {
  29283.         return true;
  29284.     }
  29285.     return false;
  29286. }',
  29287. '// creates an item from an Open WorldCat document
  29288. function processOWC(doc) {
  29289.     var spanTags = doc.getElementsByTagName("span");
  29290.     for(var i=0; i<spanTags.length; i++) {
  29291.         var spanClass = spanTags[i].getAttribute("class");
  29292.         if(spanClass) {
  29293.             var spanClasses = spanClass.split(" ");
  29294.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  29295.                 var spanTitle = spanTags[i].getAttribute("title");
  29296.                 var item = new Zotero.Item();
  29297.                 if(Zotero.Utilities.parseContextObject(spanTitle, item)) {
  29298.                     if(item.title) {
  29299.                         item.title = Zotero.Utilities.capitalizeTitle(item.title);
  29300.                     } else {
  29301.                         item.title = "[Untitled]";
  29302.                     }
  29303.                     
  29304.                     item.complete();
  29305.                     return true;
  29306.                 } else {
  29307.                     return false;
  29308.                 }
  29309.             }
  29310.         }
  29311.     }
  29312.     
  29313.     return false;
  29314. }
  29315.  
  29316. function doSearch(item) {
  29317.     if(item.contextObject) {
  29318.         var co = item.contextObject;
  29319.     } else {
  29320.         var co = Zotero.Utilities.createContextObject(item);
  29321.     }
  29322.     
  29323.     Zotero.Utilities.loadDocument("http://partneraccess.oclc.org/wcpa/servlet/OpenUrl?"+co, function(doc) {
  29324.         // find new COinS in the Open WorldCat page
  29325.         if(processOWC(doc)) {    // we got a single item page
  29326.             Zotero.done();
  29327.         } else {                // assume we have a search results page
  29328.             var items = new Array();
  29329.             
  29330.             var namespace = doc.documentElement.namespaceURI;
  29331.             var nsResolver = namespace ? function(prefix) {
  29332.                 if (prefix == ''x'') return namespace; else return null;
  29333.             } : null;
  29334.             
  29335.             // first try to get only books
  29336.             var elmts = doc.evaluate(''//table[@class="tableLayout"]/tbody/tr/td[@class="content"]/table[@class="tableResults"]/tbody/tr[td/img[@alt="Book"]]/td/div[@class="title"]/a'', doc, nsResolver, Components.interfaces.nsIDOMXPathResult.ANY_TYPE,null);
  29337.             var elmt = elmts.iterateNext();
  29338.             if(!elmt) {    // if that fails, look for other options
  29339.                 var elmts = doc.evaluate(''//table[@class="tableLayout"]/tbody/tr/td[@class="content"]/table[@class="tableResults"]/tbody/tr[td/img[@alt="Book"]]/td/div[@class="title"]/a'', doc, nsResolver, Components.interfaces.nsIDOMXPathResult.ANY_TYPE,null);
  29340.                 elmt = elmts.iterateNext()
  29341.             }
  29342.             
  29343.             var urlsToProcess = new Array();
  29344.             do {
  29345.                 urlsToProcess.push(elmt.href);
  29346.             } while(elmt = elmts.iterateNext());
  29347.             
  29348.             Zotero.Utilities.processDocuments(urlsToProcess, function(doc) {
  29349.                 // per URL
  29350.                 processOWC(doc);
  29351.             }, function() {    // done
  29352.                 Zotero.done();
  29353.             });
  29354.         }
  29355.     }, null);
  29356.     
  29357.     Zotero.wait();
  29358. }');
  29359.  
  29360.  
  29361. REPLACE INTO translators VALUES ('11645bd1-0420-45c1-badb-53fb41eeb753', '1.0.0b3.r1', '', '2007-09-15 21:00:00', 1, 100, 8, 'CrossRef', 'Simon Kornblith', 'http://partneraccess.oclc.org/',
  29362. 'function detectSearch(item) {
  29363.     if(item.itemType == "journalArticle") {
  29364.         return true;
  29365.     }
  29366.     return false;
  29367. }',
  29368. 'function processCrossRef(xmlOutput) {
  29369.     xmlOutput = xmlOutput.replace(/<\?xml[^>]*\?>/, "");
  29370.     
  29371.     // parse XML with E4X
  29372.     var qr = new Namespace("http://www.crossref.org/qrschema/2.0");
  29373.     try {
  29374.         var xml = new XML(xmlOutput);
  29375.     } catch(e) {
  29376.         return false;
  29377.     }
  29378.     
  29379.     // ensure status is valid
  29380.     var status = xml.qr::query_result.qr::body.qr::query.@status.toString();
  29381.     if(status != "resolved" && status != "multiresolved") {
  29382.         return false;
  29383.     }
  29384.     
  29385.     var query = xml.qr::query_result.qr::body.qr::query;
  29386.     var item = new Zotero.Item("journalArticle");
  29387.     
  29388.     // try to get a DOI
  29389.     item.DOI = query.qr::doi.(@type=="journal_article").text().toString();
  29390.     if(!item.DOI) {
  29391.         item.DOI = query.qr::doi.(@type=="book_title").text().toString();
  29392.     }
  29393.     if(!item.DOI) {
  29394.         item.DOI = query.qr::doi.(@type=="book_content").text().toString();
  29395.     }
  29396.     
  29397.     // try to get an ISSN (no print/electronic preferences)
  29398.     item.ISSN = query.qr::issn[0].text().toString();
  29399.     // get title
  29400.     item.title = query.qr::article_title.text().toString();
  29401.     // get publicationTitle
  29402.     item.publicationTitle = query.qr::journal_title.text().toString();
  29403.     // get author
  29404.     item.creators.push(Zotero.Utilities.cleanAuthor(query.qr::author.text().toString(), "author", true));
  29405.     // get volume
  29406.     item.volume = query.qr::volume.text().toString();
  29407.     // get issue
  29408.     item.issue = query.qr::issue.text().toString();
  29409.     // get year
  29410.     item.date = query.qr::year.text().toString();
  29411.     // get edition
  29412.     item.edition = query.qr::edition_number.text().toString();
  29413.     // get first page
  29414.     item.pages = query.qr::first_page.text().toString();
  29415.     
  29416.     item.complete();
  29417.     return true;
  29418. }
  29419.  
  29420. function doSearch(item) {
  29421.     if(item.contextObject) {
  29422.         var co = item.contextObject;
  29423.         if(co.indexOf("url_ver=") == -1) {
  29424.             co = "url_ver=Z39.88-2004&"+co;
  29425.         }
  29426.     } else {
  29427.         var co = Zotero.Utilities.createContextObject(item);
  29428.     }
  29429.     
  29430.     Zotero.Utilities.HTTP.doGet("http://www.crossref.org/openurl?req_dat=zter:zter321&"+co+"&noredirect=true", function(responseText) {
  29431.         processCrossRef(responseText);
  29432.         Zotero.done();
  29433.     });
  29434.     
  29435.     Zotero.wait();
  29436. }');
  29437.  
  29438. REPLACE INTO translators VALUES ('af4cf622-eaca-450b-bd45-0f4ba345d081', '1.0.0b3.r1', '', '2006-12-12 22:10:00', 1, 100, 8, 'CiteBase', 'Simon Kornblith', 'http://www.citebase.org/',
  29439. 'function detectSearch(item) {
  29440.     if(item.itemType == "journalArticle") {
  29441.         return true;
  29442.     }
  29443.     return false;
  29444. }',
  29445. 'function doSearch(item) {
  29446.     if(item.contextObject) {
  29447.         var co = item.contextObject;
  29448.         if(co.indexOf("url_ver=") == -1) {
  29449.             co = "url_ver=Z39.88-2004&"+co;
  29450.         }
  29451.         co = co.replace(/(?:&|^)svc_id=[^&]*/, "");
  29452.     } else {
  29453.         var co = Zotero.Utilities.createContextObject(item);
  29454.     }
  29455.     
  29456.     Zotero.Utilities.HTTP.doGet("http://www.citebase.org/openurl?"+co+"&svc_id=bibtex", function(responseText, request) {
  29457.         if(responseText.substr(0, 6) != "<?xml ") {
  29458.             // read BibTeX
  29459.             var translator = Zotero.loadTranslator("import");
  29460.             translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  29461.             translator.setString(responseText);
  29462.             translator.translate();
  29463.         }
  29464.         
  29465.         Zotero.done();
  29466.     });
  29467.     
  29468.     Zotero.wait();
  29469. }');
  29470.  
  29471. REPLACE INTO translators VALUES ('0e2235e7-babf-413c-9acf-f27cce5f059c', '1.0.8', '', '2008-10-20 10:10:37', 1, 50, 3, 'MODS', 'Simon Kornblith', 'xml',
  29472. 'Zotero.addOption("exportNotes", true);
  29473.  
  29474. function detectImport() {
  29475.     var read = Zotero.read(512);
  29476.     var modsTagRegexp = /<mods[^>]+>/
  29477.     if(modsTagRegexp.test(read)) {
  29478.         return true;
  29479.     }
  29480. }',
  29481. 'var partialItemTypes = ["bookSection", "journalArticle", "magazineArticle", "newspaperArticle"];
  29482.  
  29483. function doExport() {
  29484.     Zotero.setCharacterSet("utf-8");
  29485.     var modsCollection = <modsCollection xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd" />;
  29486.     
  29487.     var item;
  29488.     while(item = Zotero.nextItem()) {
  29489.         var isPartialItem = Zotero.Utilities.inArray(item.itemType, partialItemTypes);
  29490.         
  29491.         var mods = <mods />;
  29492.         
  29493.         /** CORE FIELDS **/
  29494.         
  29495.         // XML tag titleInfo; object field title
  29496.         if(item.title) {
  29497.             mods.titleInfo.title = item.title;
  29498.         }
  29499.         
  29500.         // XML tag typeOfResource/genre; object field type
  29501.         var modsType, marcGenre;
  29502.         if(item.itemType == "book" || item.itemType == "bookSection") {
  29503.             modsType = "text";
  29504.             marcGenre = "book";
  29505.         } else if(item.itemType == "journalArticle" || item.itemType == "magazineArticle") {
  29506.             modsType = "text";
  29507.             marcGenre = "periodical";
  29508.         } else if(item.itemType == "newspaperArticle") {
  29509.             modsType = "text";
  29510.             marcGenre = "newspaper";
  29511.         } else if(item.itemType == "thesis") {
  29512.             modsType = "text";
  29513.             marcGenre = "theses";
  29514.         } else if(item.itemType == "letter") {
  29515.             modsType = "text";
  29516.             marcGenre = "letter";
  29517.         } else if(item.itemType == "manuscript") {
  29518.             modsType = "text";
  29519.             modsType.@manuscript = "yes";
  29520.         } else if(item.itemType == "interview") {
  29521.             modsType = "text";
  29522.             marcGenre = "interview";
  29523.         } else if(item.itemType == "film") {
  29524.             modsType = "moving image";
  29525.             marcGenre = "motion picture";
  29526.         } else if(item.itemType == "artwork") {
  29527.             modsType = "still image";
  29528.             marcGenre = "art original";
  29529.         } else if(item.itemType == "webpage") {
  29530.             modsType = "multimedia";
  29531.             marcGenre = "web site";
  29532.         } else if(item.itemType == "note" || item.itemType == "attachment") {
  29533.             continue;
  29534.         }
  29535.         mods.typeOfResource = modsType;
  29536.         mods.genre += <genre authority="local">{item.itemType}</genre>;
  29537.         if(marcGenre) {
  29538.             mods.genre += <genre authority="marcgt">{marcGenre}</genre>;
  29539.         }
  29540.         
  29541.         // XML tag genre; object field thesisType, type
  29542.         if(item.thesisType) {
  29543.             mods.genre += <genre>{item.thesisType}</genre>;
  29544.         }
  29545.         if(item.type) {
  29546.             mods.genre += <genre>{item.type}</genre>;
  29547.         }
  29548.         
  29549.         // XML tag name; object field creators
  29550.         for(var j in item.creators) {
  29551.             var roleTerm = "";
  29552.             if(item.creators[j].creatorType == "author") {
  29553.                 roleTerm = "aut";
  29554.             } else if(item.creators[j].creatorType == "editor") {
  29555.                 roleTerm = "edt";
  29556.             } else if(item.creators[j].creatorType == "creator") {
  29557.                 roleTerm = "ctb";
  29558.             }
  29559.             
  29560.             // FIXME - currently all names are personal
  29561.             mods.name += <name type="personal">
  29562.                 <namePart type="family">{item.creators[j].lastName}</namePart>
  29563.                 <namePart type="given">{item.creators[j].firstName}</namePart>
  29564.                 <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
  29565.                 </name>;
  29566.         }
  29567.         
  29568.         // XML tag recordInfo.recordOrigin; used to store our generator note
  29569.         //mods.recordInfo.recordOrigin = "Zotero for Firefox "+Zotero.Utilities.getVersion();
  29570.         
  29571.         /** FIELDS ON NEARLY EVERYTHING BUT NOT A PART OF THE CORE **/
  29572.         
  29573.         // XML tag recordInfo.recordContentSource; object field source
  29574.         if(item.source) {
  29575.             mods.recordInfo.recordContentSource = item.source;
  29576.         }
  29577.         // XML tag recordInfo.recordIdentifier; object field accessionNumber
  29578.         if(item.accessionNumber) {
  29579.             mods.recordInfo.recordIdentifier = item.accessionNumber;
  29580.         }
  29581.         
  29582.         // XML tag accessCondition; object field rights
  29583.         if(item.rights) {
  29584.             mods.accessCondition = item.rights;
  29585.         }
  29586.         
  29587.         /** SUPPLEMENTAL FIELDS **/
  29588.         
  29589.         // Make part its own tag so we can figure out where it goes later
  29590.         var part = new XML();
  29591.         
  29592.         // XML tag detail; object field volume
  29593.         if(item.volume) {
  29594.             if(Zotero.Utilities.isInt(item.volume)) {
  29595.                 part += <detail type="volume"><number>{item.volume}</number></detail>;
  29596.             } else {
  29597.                 part += <detail type="volume"><text>{item.volume}</text></detail>;
  29598.             }
  29599.         }
  29600.         
  29601.         // XML tag detail; object field number
  29602.         if(item.issue) {
  29603.             if(Zotero.Utilities.isInt(item.issue)) {
  29604.                 part += <detail type="issue"><number>{item.issue}</number></detail>;
  29605.             } else {
  29606.                 part += <detail type="issue"><text>{item.issue}</text></detail>;
  29607.             }
  29608.         }
  29609.         
  29610.         // XML tag detail; object field section
  29611.         if(item.section) {
  29612.             if(Zotero.Utilities.isInt(item.section)) {
  29613.                 part += <detail type="section"><number>{item.section}</number></detail>;
  29614.             } else {
  29615.                 part += <detail type="section"><text>{item.section}</text></detail>;
  29616.             }
  29617.         }
  29618.         
  29619.         // XML tag detail; object field pages
  29620.         if(item.pages) {
  29621.             var range = Zotero.Utilities.getPageRange(item.pages);
  29622.             part += <extent unit="pages"><start>{range[0]}</start><end>{range[1]}</end></extent>;
  29623.         }
  29624.         
  29625.         // Assign part if something was assigned
  29626.         if(part.length() != 1) {
  29627.             if(isPartialItem) {
  29628.                 // For a journal article, bookSection, etc., the part is the host
  29629.                 mods.relatedItem.part += <part>{part}</part>;
  29630.             } else {
  29631.                 mods.part += <part>{part}</part>;
  29632.             }
  29633.         }
  29634.         
  29635.         // XML tag originInfo; object fields edition, place, publisher, year, date
  29636.         var originInfo = new XML();
  29637.         if(item.edition) {
  29638.             originInfo += <edition>{item.edition}</edition>;
  29639.         }
  29640.         if(item.place) {
  29641.             originInfo += <place><placeTerm type="text">{item.place}</placeTerm></place>;
  29642.         }
  29643.         if(item.publisher) {
  29644.             originInfo += <publisher>{item.publisher}</publisher>;
  29645.         } else if(item.distributor) {
  29646.             originInfo += <publisher>{item.distributor}</publisher>;
  29647.         }
  29648.         if(item.date) {
  29649.             if(Zotero.Utilities.inArray(item.itemType, ["book", "bookSection"])) {
  29650.                 // Assume year is copyright date
  29651.                 var dateType = "copyrightDate";
  29652.             } else if(Zotero.Utilities.inArray(item.itemType, ["journalArticle", "magazineArticle", "newspaperArticle"])) {
  29653.                 // Assume date is date issued
  29654.                 var dateType = "dateIssued";
  29655.             } else {
  29656.                 // Assume date is date created
  29657.                 var dateType = "dateCreated";
  29658.             }
  29659.             var tag = <{dateType}>{item.date}</{dateType}>;
  29660.             originInfo += tag;
  29661.         }
  29662.         if(item.accessDate) {
  29663.             originInfo += <dateCaptured>{item.accessDate}</dateCaptured>;
  29664.         }
  29665.         if(originInfo.length() != 1) {
  29666.             if(isPartialItem) {
  29667.                 // For a journal article, bookSection, etc., this goes under the host
  29668.                 mods.relatedItem.originInfo += <originInfo>{originInfo}</originInfo>;
  29669.             } else {
  29670.                 mods.originInfo += <originInfo>{originInfo}</originInfo>;
  29671.             }
  29672.         }
  29673.         
  29674.         // XML tag identifier; object fields ISBN, ISSN
  29675.         if(isPartialItem) {
  29676.             var identifier = mods.relatedItem;
  29677.         } else {
  29678.             var identifier = mods;
  29679.         }
  29680.         if(item.ISBN) {
  29681.             identifier.identifier += <identifier type="isbn">{item.ISBN}</identifier>;
  29682.         }
  29683.         if(item.ISSN) {
  29684.             identifier.identifier += <identifier type="issn">{item.ISSN}</identifier>;
  29685.         }
  29686.         if(item.DOI) {
  29687.             mods.identifier += <identifier type="doi">{item.DOI}</identifier>;
  29688.         }
  29689.         
  29690.         // XML tag relatedItem.titleInfo; object field publication
  29691.         if(item.publicationTitle) {
  29692.             mods.relatedItem.titleInfo += <titleInfo><title>{item.publicationTitle}</title></titleInfo>;
  29693.         }
  29694.         
  29695.         // XML tag classification; object field callNumber
  29696.         if(item.callNumber) {
  29697.             mods.classification = item.callNumber;
  29698.         }
  29699.         
  29700.         // XML tag location.physicalLocation; object field archiveLocation
  29701.         if(item.archiveLocation) {
  29702.             mods.location.physicalLocation = item.archiveLocation;
  29703.         }
  29704.         
  29705.         // XML tag location.url; object field archiveLocation
  29706.         if(item.url) {
  29707.             mods.location.url = item.url;
  29708.         }
  29709.         
  29710.         // XML tag title.titleInfo; object field journalAbbreviation
  29711.         if(item.journalAbbreviation) {
  29712.             mods.relatedItem.titleInfo += <titleInfo type="abbreviated"><title>{item.journalAbbreviation}</title></titleInfo>;
  29713.         }
  29714.         
  29715.         // XML tag abstract; object field abstractNote
  29716.         if(item.abstractNote) {
  29717.             mods.abstract = item.abstractNote;
  29718.         }
  29719.         
  29720.         if(mods.relatedItem.length() == 1 && isPartialItem) {
  29721.             mods.relatedItem.@type = "host";
  29722.         }
  29723.         
  29724.         /** NOTES **/
  29725.         
  29726.         if(Zotero.getOption("exportNotes")) {
  29727.             for(var j in item.notes) {
  29728.                 // Add note tag
  29729.                 var note = <note type="content">{item.notes[j].note}</note>;
  29730.                 mods.note += note;
  29731.             }
  29732.         }
  29733.         
  29734.         /** TAGS **/
  29735.         
  29736.         for(var j in item.tags) {
  29737.             mods.subject += <subject><topic>{item.tags[j].tag}</topic></subject>;
  29738.         }
  29739.         
  29740.         
  29741.         // XML tag relatedItem.titleInfo; object field series
  29742.         if(item.seriesTitle || item.series || item.seriesNumber || item.seriesText) {
  29743.             var series = <relatedItem type="series"/>;
  29744.             
  29745.             if(item.series) {
  29746.                 series.titleInfo.title = item.series;
  29747.             }
  29748.             
  29749.             if(item.seriesTitle) {
  29750.                 series.titleInfo.partTitle = item.seriesTitle;
  29751.             }
  29752.             
  29753.             if(item.seriesText) {
  29754.                 series.titleInfo.subTitle = item.seriesText;
  29755.             }
  29756.             
  29757.             if(item.seriesNumber) {
  29758.                 series.titleInfo.partNumber = item.seriesNumber;
  29759.             }
  29760.             
  29761.             // TODO: make this work in import
  29762.             /*if(item.itemType == "bookSection") {
  29763.                 // For a book section, series info must go inside host tag
  29764.                 mods.relatedItem.relatedItem = series;
  29765.             } else {*/
  29766.                 mods.relatedItem += series;
  29767.             //}
  29768.         }
  29769.         
  29770.         modsCollection.mods += mods;
  29771.     }
  29772.     
  29773.     Zotero.write(''<?xml version="1.0"?>''+"\n");
  29774.     Zotero.write(modsCollection.toXMLString());
  29775. }
  29776.  
  29777. function processIdentifiers(newItem, identifier) {
  29778.     for each(var myIdentifier in identifier) {
  29779.         if(myIdentifier.@type == "isbn") {
  29780.             newItem.ISBN = myIdentifier.text().toString()
  29781.         } else if(myIdentifier.@type == "issn") {
  29782.             newItem.ISSN = myIdentifier.text().toString()
  29783.         } else if(myIdentifier.@type == "doi") {
  29784.             newItem.DOI = myIdentifier.text().toString()
  29785.         }
  29786.     }
  29787. }
  29788.  
  29789. function doImport() {
  29790.     var marcGenres = {
  29791.         "book":"book",
  29792.         "periodical":"journalArticle",
  29793.         "newspaper":"newspaperArticle",
  29794.         "theses":"thesis",
  29795.         "letter":"letter",
  29796.         "motion picture":"film",
  29797.         "art original":"artwork",
  29798.         "web site":"webpage"
  29799.     };
  29800.     
  29801.     
  29802.     var read;
  29803.     
  29804.     // read until we see if the file begins with a parse instruction
  29805.     read = " ";
  29806.     while(read == " " || read == "\n" || read == "\r") {
  29807.         read = Zotero.read(1);
  29808.     }
  29809.     
  29810.     var firstPart = read + Zotero.read(4);
  29811.     if(firstPart == "<?xml") {
  29812.         // got a parse instruction, read until it ends
  29813.         read = true;
  29814.         while((read !== false) && (read !== ">")) {
  29815.             read = Zotero.read(1);
  29816.             firstPart += read;
  29817.         }
  29818.         var encodingRe = /encoding=[''"]([^''"]+)[''"]/;
  29819.         var m = encodingRe.exec(firstPart);
  29820.         // set character set
  29821.         try {
  29822.             Zotero.setCharacterSet(m[1]);
  29823.         } catch(e) {
  29824.             Zotero.setCharacterSet("utf-8");
  29825.         }
  29826.     } else {
  29827.         Zotero.setCharacterSet("utf-8");
  29828.     }
  29829.     
  29830.     // read in 16384 byte increments
  29831.     var text = "";
  29832.     while(read = Zotero.read(16384)) {
  29833.         text += read;
  29834.     }
  29835.     text = text.replace(/<\?xml[^>]+\?>/, "");
  29836.     
  29837.     // parse with E4X
  29838.     var m = new Namespace("http://www.loc.gov/mods/v3");
  29839.     // why does this default namespace declaration not work!?
  29840.     default xml namespace = m;
  29841.     var xml = new XML(text);
  29842.     
  29843.     if(xml.m::mods.length()) {
  29844.         var modsElements = xml.m::mods;
  29845.     } else {
  29846.         var modsElements = [xml];
  29847.     }
  29848.     
  29849.     for each(var mods in modsElements) {
  29850.         var newItem = new Zotero.Item();
  29851.         
  29852.         // title
  29853.         for each(var titleInfo in mods.m::titleInfo) {
  29854.             if(titleInfo.@type != "abbreviated") {
  29855.                 newItem.title = titleInfo.m::title;
  29856.             }
  29857.         }
  29858.         // try to get genre from local genre
  29859.         for each(var genre in mods.m::genre) {
  29860.             if(genre.@authority == "local" && Zotero.Utilities.itemTypeExists(genre)) {
  29861.                 newItem.itemType = genre.text().toString();
  29862.             } else if(!newItem.itemType && (genre.@authority == "marcgt" || genre.@authority == "marc")) {
  29863.                 // otherwise, look at the marc genre
  29864.                 newItem.itemType = marcGenres[genre.text().toString()];
  29865.             }
  29866.         }
  29867.         
  29868.         if(!newItem.itemType) {
  29869.             // try to get genre data from host
  29870.             for each(var relatedItem in mods.m::relatedItem) {
  29871.                 if(relatedItem.@type == "host") {
  29872.                     for each(var genre in relatedItem.m::genre) {
  29873.                         if(genre.@authority == "marcgt" || genre.@authority == "marc") {
  29874.                             newItem.itemType = marcGenres[genre.text().toString()];
  29875.                             break;
  29876.                         }
  29877.                     }
  29878.                 }
  29879.             }
  29880.             
  29881.             // check if this is an electronic resource
  29882.             if(!newItem.itemType) {
  29883.                 for each(var form in mods.m::physicalDescription.m::form) {
  29884.                     if(form.@authority == "marcform" || form.@authority == "marc") {
  29885.                         if(form.text().toString() == "electronic") {
  29886.                             newItem.itemType = "webpage";
  29887.                             break;
  29888.                         }
  29889.                     }
  29890.                 }
  29891.                 
  29892.                 if(!newItem.itemType) newItem.itemType = "book";
  29893.             }
  29894.         }
  29895.         
  29896.         var isPartialItem = Zotero.Utilities.inArray(newItem.itemType, partialItemTypes);
  29897.         
  29898.         // TODO: thesisType, type
  29899.         
  29900.         for each(var name in mods.m::name) {
  29901.             // TODO: institutional authors
  29902.             var creator = new Array();
  29903.             for each(var namePart in name.m::namePart) {
  29904.                 if(namePart.@type == "given") {
  29905.                     creator.firstName = namePart.text().toString();
  29906.                 } else if(namePart.@type == "family") {
  29907.                     creator.lastName = namePart.text().toString();
  29908.                 } else {
  29909.                     var backupName = namePart.text().toString();
  29910.                 }
  29911.             }
  29912.             
  29913.             if(backupName && !creator.firstName && !creator.lastName) {
  29914.                 creator = Zotero.Utilities.cleanAuthor(backupName, "author", true);
  29915.             }
  29916.             
  29917.             // look for roles
  29918.             for(var role in name.m::role.m::roleTerm) {
  29919.                 if(role.@type == "code" && role.@authority == "marcrelator") {
  29920.                     if(role == "edt") {
  29921.                         creator.creatorType = "editor";
  29922.                     } else if(role == "ctb") {
  29923.                         creator.creatorType = "contributor";
  29924.                     } else if(role == "trl") {
  29925.                         creator.creatorType = "translator";
  29926.                     }
  29927.                 }
  29928.             }
  29929.             if(!creator.creatorType) creator.creatorType = "author";
  29930.             
  29931.             newItem.creators.push(creator);
  29932.         }
  29933.         
  29934.         // source
  29935.         newItem.source = mods.m::recordInfo.m::recordContentSource.text().toString();
  29936.         // accessionNumber
  29937.         newItem.accessionNumber = mods.m::recordInfo.m::recordIdentifier.text().toString();
  29938.         // rights
  29939.         newItem.rights = mods.m::accessCondition.text().toString();
  29940.         
  29941.         /** SUPPLEMENTAL FIELDS **/
  29942.         
  29943.         var part = false, originInfo = false;
  29944.         
  29945.         // series
  29946.         for each(var relatedItem in mods.m::relatedItem) {
  29947.             if(relatedItem.@type == "host") {
  29948.                 for each(var titleInfo in relatedItem.m::titleInfo) {
  29949.                     if(titleInfo.@type == "abbreviated") {
  29950.                         newItem.journalAbbreviation = titleInfo.m::title.text().toString();
  29951.                         if(!newItem.publicationTitle) newItem.publicationTitle = newItem.journalAbbreviation;
  29952.                     } else {
  29953.                         newItem.publicationTitle = titleInfo.m::title.text().toString();
  29954.                     }
  29955.                 }
  29956.                 part = relatedItem.m::part;
  29957.                 originInfo = relatedItem.m::originInfo;
  29958.                 processIdentifiers(newItem, relatedItem.m::identifier);
  29959.             } else if(relatedItem.@type == "series") {
  29960.                 newItem.series = relatedItem.m::titleInfo.m::title.text().toString();
  29961.                 newItem.seriesTitle = relatedItem.m::titleInfo.m::partTitle.text().toString();
  29962.                 newItem.seriesText = relatedItem.m::titleInfo.m::subTitle.text().toString();
  29963.                 newItem.seriesNumber = relatedItem.m::titleInfo.m::partNumber.text().toString();
  29964.             }
  29965.         }
  29966.         
  29967.         // get part
  29968.         if(!part) {
  29969.             part = mods.m::part;
  29970.             originInfo = mods.m::originInfo;
  29971.         }
  29972.         
  29973.         if(part) {
  29974.             for each(var detail in part.m::detail) {
  29975.                 // volume
  29976.                 if(detail.@type == "volume") {
  29977.                     newItem.volume = detail.m::number.text().toString();
  29978.                     if(!newItem.volume) {
  29979.                         newItem.volume = detail.m::text.text().toString();
  29980.                     }
  29981.                 }
  29982.                 
  29983.                 // number
  29984.                 if(detail.@type == "issue") {
  29985.                     newItem.issue = detail.m::number.text().toString();
  29986.                     if(!newItem.issue) {
  29987.                         newItem.issue = detail.m::text.text().toString();
  29988.                     }
  29989.                 }
  29990.                 
  29991.                 // section
  29992.                 if(detail.@type == "section") {
  29993.                     newItem.section = detail.m::number.text().toString();
  29994.                     if(!newItem.section) {
  29995.                         newItem.section = detail.m::text.text().toString();
  29996.                     }
  29997.                 }
  29998.             }
  29999.             
  30000.             // pages
  30001.             for each(var extent in part.m::extent) {
  30002.                 if(extent.@unit == "pages" || extent.@unit == "page") {
  30003.                     var pagesStart = extent.m::start.text().toString();
  30004.                     var pagesEnd = extent.m::end.text().toString();
  30005.                     if(pagesStart || pagesEnd) {
  30006.                         if(pagesStart == pagesEnd) {
  30007.                             newItem.pages = pagesStart;
  30008.                         } else if(pagesStart && pagesEnd) {
  30009.                             newItem.pages = pagesStart+"-"+pagesEnd;
  30010.                         } else {
  30011.                             newItem.pages = pagesStart+pagesEnd;
  30012.                         }
  30013.                     }
  30014.                 }
  30015.             }
  30016.         }
  30017.         
  30018.         // identifier
  30019.         processIdentifiers(newItem, mods.m::identifier);
  30020.         // edition
  30021.         newItem.edition = originInfo.m::edition.text().toString();
  30022.         // place
  30023.         for each(var placeTerm in originInfo.m::place.m::placeTerm) {
  30024.             if(placeTerm.@type == "text") {
  30025.                 newItem.place = placeTerm.text().toString();
  30026.             }
  30027.         }
  30028.         // publisher/distributor
  30029.         if(originInfo.m::publisher.length()) {
  30030.             if(newItem.itemType == "webpage" || newItem.itemType == "website") {
  30031.                 newItem.publicationTitle = originInfo.m::publisher[0].text().toString();
  30032.             } else {
  30033.                 newItem.publisher = originInfo.m::publisher[0].text().toString();
  30034.             }
  30035.         }
  30036.         // date
  30037.         if(originInfo.m::copyrightDate.length()) {
  30038.             newItem.date = originInfo.m::copyrightDate[0].text().toString();
  30039.         } else if(originInfo.m::dateIssued.length()) {
  30040.             newItem.date = originInfo.m::dateIssued[0].text().toString();
  30041.         } else if(originInfo.m::dateCreated.length()) {
  30042.             newItem.date = originInfo.m::dateCreated[0].text().toString();
  30043.         }
  30044.         // lastModified
  30045.         newItem.lastModified = originInfo.m::dateModified.text().toString();
  30046.         // accessDate
  30047.         newItem.accessDate = originInfo.m::dateCaptured.text().toString();
  30048.         
  30049.         // call number
  30050.         newItem.callNumber = mods.m::classification.text().toString();
  30051.         // archiveLocation
  30052.         newItem.archiveLocation = mods.m::location.m::physicalLocation.text().toString();
  30053.         // attachments and url
  30054.         for each(var url in mods.m::location.m::url) {
  30055.             var value = url.text().toString();
  30056.             if (url.@access == "raw object") {
  30057.                 var filetitle;
  30058.                 if (url.@displayLabel){
  30059.                     filetitle = url.@displayLabel;
  30060.                 } else {
  30061.                     filetitle = "Attachment";
  30062.                 }
  30063.                 if (value.substr(-4,4)==".pdf") {
  30064.                     newItem.attachments.push({url:value, mimeType:"application/pdf", title:filetitle, downloadable:true});
  30065.                 } else {
  30066.                     newItem.attachments.push({url:value, title:filetitle, downloadable:true});
  30067.                 }
  30068.             } else {
  30069.                 newItem.url = value;
  30070.             }
  30071.         }
  30072.         // abstract
  30073.         newItem.abstractNote = mods.m::abstract.text().toString();
  30074.         
  30075.         /** NOTES **/
  30076.         for each(var note in mods.m::note) {
  30077.             newItem.notes.push({note:note.text().toString()});
  30078.         }
  30079.         
  30080.         /** TAGS **/
  30081.         for each(var subject in mods.m::subject.m::topic) {
  30082.             newItem.tags.push(subject.text().toString());
  30083.         }
  30084.         
  30085.         Zotero.debug(newItem);
  30086.         
  30087.         newItem.complete();
  30088.     }
  30089. }');
  30090.  
  30091.  
  30092. REPLACE INTO translators VALUES ('14763d24-8ba0-45df-8f52-b8d1108e7ac9', '1.0.0b4.r1', '', '2009-01-02 20:55:00', 1, 25, 2, 'Zotero RDF', 'Simon Kornblith', 'rdf',
  30093. 'Zotero.configure("getCollections", true);
  30094. Zotero.configure("dataMode", "rdf");
  30095. Zotero.addOption("exportNotes", true);
  30096. Zotero.addOption("exportFileData", false);',
  30097. 'var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
  30098.  
  30099. var n = {
  30100.     bib:"http://purl.org/net/biblio#",
  30101.     dc:"http://purl.org/dc/elements/1.1/",
  30102.     dcterms:"http://purl.org/dc/terms/",
  30103.     prism:"http://prismstandard.org/namespaces/1.2/basic/",
  30104.     foaf:"http://xmlns.com/foaf/0.1/",
  30105.     vcard:"http://nwalsh.com/rdf/vCard#",
  30106.     link:"http://purl.org/rss/1.0/modules/link/",
  30107.     z:"http://www.zotero.org/namespaces/export#"
  30108. };
  30109.  
  30110. function generateSeeAlso(resource, seeAlso) {
  30111.     for(var i in seeAlso) {
  30112.         if(itemResources[seeAlso[i]]) {
  30113.             Zotero.RDF.addStatement(resource, n.dc+"relation", itemResources[seeAlso[i]], false);
  30114.         }
  30115.     }
  30116. }
  30117.  
  30118. function generateTags(resource, tags) {
  30119.     Zotero.debug("processing tags");
  30120.     for each(var tag in tags) {
  30121.         if(tag.type == 1) {
  30122.             var tagResource = Zotero.RDF.newResource();
  30123.             // set tag type and value
  30124.             Zotero.RDF.addStatement(tagResource, rdf+"type", n.z+"AutomaticTag", false);
  30125.             Zotero.RDF.addStatement(tagResource, rdf+"value", tag.tag, true);
  30126.             // add relationship to resource
  30127.             Zotero.RDF.addStatement(resource, n.dc+"subject", tagResource, false);
  30128.         } else {
  30129.             Zotero.RDF.addStatement(resource, n.dc+"subject", tag.tag, true);
  30130.         }
  30131.     }
  30132. }
  30133.  
  30134. function generateCollection(collection) {
  30135.     var collectionResource = "#collection_"+collection.id;
  30136.     Zotero.RDF.addStatement(collectionResource, rdf+"type", n.z+"Collection", false);
  30137.     Zotero.RDF.addStatement(collectionResource, n.dc+"title", collection.name, true);
  30138.     
  30139.     var children = collection.children ? collection.children : collection.descendents;
  30140.     if(!children) return;
  30141.     for each(var child in children) {
  30142.         // add child list items
  30143.         if(child.type == "collection") {
  30144.             Zotero.RDF.addStatement(collectionResource, n.dcterms+"hasPart", "#collection_"+child.id, false);
  30145.             // do recursive processing of collections
  30146.             generateCollection(child);
  30147.         } else if(itemResources[child.id]) {
  30148.             Zotero.RDF.addStatement(collectionResource, n.dcterms+"hasPart", itemResources[child.id], false);
  30149.         }
  30150.     }
  30151. }
  30152.  
  30153. function generateItem(item, zoteroType, resource) {
  30154.     var container = null;
  30155.     var containerElement = null;
  30156.     
  30157.     /** CORE FIELDS **/
  30158.     
  30159.     // type
  30160.     var type = null;
  30161.     if(zoteroType == "book") {
  30162.         type = n.bib+"Book";
  30163.     } else if (zoteroType == "bookSection") {
  30164.         type = n.bib+"BookSection";
  30165.         container = n.bib+"Book";
  30166.     } else if(zoteroType == "journalArticle") {
  30167.         type = n.bib+"Article";
  30168.         container = n.bib+"Journal";
  30169.     } else if(zoteroType == "magazineArticle") {
  30170.         type = n.bib+"Article";
  30171.         container = n.bib+"Periodical";
  30172.     } else if(zoteroType == "newspaperArticle") {
  30173.         type = n.bib+"Article";
  30174.         container = n.bib+"Newspaper";
  30175.     } else if(zoteroType == "thesis") {
  30176.         type = n.bib+"Thesis";
  30177.     } else if(zoteroType == "letter") {
  30178.         type = n.bib+"Letter";
  30179.     } else if(zoteroType == "manuscript") {
  30180.         type = n.bib+"Manuscript";
  30181.     } else if(zoteroType == "interview") {
  30182.         type = n.bib+"Interview";
  30183.     } else if(zoteroType == "film") {
  30184.         type = n.bib+"MotionPicture";
  30185.     } else if(zoteroType == "artwork") {
  30186.         type = n.bib+"Illustration";
  30187.     } else if(zoteroType == "webpage") {
  30188.         type = n.bib+"Document";
  30189.         container = n.z+"Website";
  30190.     } else if(zoteroType == "note") {
  30191.         type = n.bib+"Memo";
  30192.         if(!Zotero.getOption("exportNotes")) {
  30193.             return;
  30194.         }
  30195.     } else if(zoteroType == "attachment") {
  30196.         type = n.z+"Attachment";
  30197.     } else if(zoteroType == "report") {
  30198.         type = n.bib+"Report";
  30199.     } else if(zoteroType == "bill") {
  30200.         type = n.bib+"Legislation";
  30201.     } else if(zoteroType == "case") {
  30202.         type = n.bib+"Document";    // ??
  30203.         container = n.bib+"CourtReporter";
  30204.     } else if(zoteroType == "hearing") {
  30205.         type = n.bib+"Report";
  30206.     } else if(zoteroType == "patent") {
  30207.         type = n.bib+"Patent";
  30208.     } else if(zoteroType == "statute") {
  30209.         type = n.bib+"Legislation";
  30210.     } else if(zoteroType == "email") {
  30211.         type = n.bib+"Letter";
  30212.     } else if(zoteroType == "map") {
  30213.         type = n.bib+"Image";
  30214.     } else if(zoteroType == "blogPost") {
  30215.         type = n.bib+"Document";
  30216.         container = n.z+"Blog";
  30217.     } else if(zoteroType == "instantMessage") {
  30218.         type = n.bib+"Letter";
  30219.     } else if(zoteroType == "forumPost") {
  30220.         type = n.bib+"Document";
  30221.         container = n.z+"Forum";
  30222.     } else if(zoteroType == "audioRecording") {
  30223.         type = n.bib+"Recording";
  30224.     } else if(zoteroType == "presentation") {
  30225.         type = n.bib+"ConferenceProceedings";
  30226.     } else if(zoteroType == "videoRecording") {
  30227.         type = n.bib+"Recording";
  30228.     } else if(zoteroType == "tvBroadcast") {
  30229.         type = n.bib+"Recording";
  30230.     } else if(zoteroType == "radioBroadcast") {
  30231.         type = n.bib+"Recording";
  30232.     } else if(zoteroType == "podcast") {
  30233.         type = n.bib+"Recording";
  30234.     } else if(zoteroType == "computerProgram") {
  30235.         type = n.bib+"Data";
  30236.     }
  30237.     
  30238.     if(type) {
  30239.         Zotero.RDF.addStatement(resource, rdf+"type", type, false);
  30240.     }
  30241.     Zotero.RDF.addStatement(resource, n.z+"itemType", zoteroType, true);
  30242.     
  30243.     // generate section
  30244.     if(item.section) {
  30245.         var section = Zotero.RDF.newResource();
  30246.         // set section type
  30247.         Zotero.RDF.addStatement(section, rdf+"type", n.bib+"Part", false);
  30248.         // set section title
  30249.         Zotero.RDF.addStatement(section, n.dc+"title", item.section, true);
  30250.         // add relationship to resource
  30251.         Zotero.RDF.addStatement(resource, n.dcterms+"isPartOf", section, false);
  30252.     }
  30253.     
  30254.     // generate container
  30255.     if(container) {
  30256.         if(item.ISSN && !Zotero.RDF.getArcsIn("urn:issn:"+item.ISSN)) {
  30257.             // use ISSN as container URI if no other item is
  30258.             containerElement = "urn:issn:"+item.ISSN;
  30259.         } else {
  30260.             containerElement = Zotero.RDF.newResource();
  30261.         }
  30262.         // attach container to section (if exists) or resource
  30263.         Zotero.RDF.addStatement((section ? section : resource), n.dcterms+"isPartOf", containerElement, false);
  30264.         // add container type
  30265.         Zotero.RDF.addStatement(containerElement, rdf+"type", container, false);
  30266.     }
  30267.     
  30268.     // generate series
  30269.     if(item.series || item.seriesTitle || item.seriesText || item.seriesNumber) {
  30270.         var series = Zotero.RDF.newResource();
  30271.         // set series type
  30272.         Zotero.RDF.addStatement(series, rdf+"type", n.bib+"Series", false);
  30273.         // add relationship to resource
  30274.         Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dcterms+"isPartOf", series, false);
  30275.     }
  30276.     
  30277.     // generate publisher
  30278.     if(item.publisher || item.distributor || item.label || item.company || item.institution || item.place) {
  30279.         var organization = Zotero.RDF.newResource();
  30280.         // set organization type
  30281.         Zotero.RDF.addStatement(organization, rdf+"type", n.foaf+"Organization", false);
  30282.         // add relationship to resource
  30283.         Zotero.RDF.addStatement(resource, n.dc+"publisher", organization, false);
  30284.     }
  30285.     
  30286.     var typeProperties = ["reportType", "videoRecordingType", "letterType",
  30287.                             "manuscriptType", "mapType", "thesisType", "websiteType",
  30288.                             "audioRecordingType", "presentationType", "postType",
  30289.                             "audioFileType"];
  30290.     var ignoreProperties = ["itemID", "itemType", "firstCreator", "dateAdded",
  30291.                             "dateModified", "section", "sourceItemID"];
  30292.     
  30293.     // creators
  30294.     if(item.creators) {            // authors/editors/contributors
  30295.         var creatorContainers = new Object();
  30296.         
  30297.         // not yet in biblio
  30298.         var biblioCreatorTypes = ["author", "editor", "contributor"];
  30299.         
  30300.         for(var j in item.creators) {
  30301.             var creator = Zotero.RDF.newResource();
  30302.             Zotero.RDF.addStatement(creator, rdf+"type", n.foaf+"Person", false);
  30303.             // gee. an entire vocabulary for describing people, and these aren''t even
  30304.             // standardized in it. oh well. using them anyway.
  30305.             Zotero.RDF.addStatement(creator, n.foaf+"surname", item.creators[j].lastName, true);
  30306.             Zotero.RDF.addStatement(creator, n.foaf+"givenname", item.creators[j].firstName, true);
  30307.             
  30308.             if(biblioCreatorTypes.indexOf(item.creators[j].creatorType) != -1) {
  30309.                 var cTag = n.bib+item.creators[j].creatorType+"s";
  30310.             } else {
  30311.                 var cTag = n.z+item.creators[j].creatorType+"s";
  30312.             }
  30313.             
  30314.             if(!creatorContainers[cTag]) {
  30315.                 var creatorResource = Zotero.RDF.newResource();
  30316.                 // create new seq for author type
  30317.                 creatorContainers[cTag] = Zotero.RDF.newContainer("seq", creatorResource);
  30318.                 // attach container to resource
  30319.                 Zotero.RDF.addStatement(resource, cTag, creatorResource, false);
  30320.             }
  30321.             Zotero.RDF.addContainerElement(creatorContainers[cTag], creator, false);
  30322.         }
  30323.     }
  30324.     
  30325.     // notes
  30326.     if(item.notes && Zotero.getOption("exportNotes")) {
  30327.         for(var j in item.notes) {
  30328.             var noteResource = itemResources[item.notes[j].itemID];
  30329.             
  30330.             // add note tag
  30331.             Zotero.RDF.addStatement(noteResource, rdf+"type", n.bib+"Memo", false);
  30332.             // add note item.notes
  30333.             Zotero.RDF.addStatement(noteResource, rdf+"value", item.notes[j].note, true);
  30334.             // add relationship between resource and note
  30335.             Zotero.RDF.addStatement(resource, n.dcterms+"isReferencedBy", noteResource, false);
  30336.             
  30337.             // Add see also info to RDF
  30338.             generateSeeAlso(noteResource, item.notes[j].seeAlso);
  30339.             generateTags(noteResource, item.notes[j].tags);
  30340.         }
  30341.     }
  30342.     
  30343.     // child attachments
  30344.     if(item.attachments) {
  30345.         for each(var attachment in item.attachments) {
  30346.             var attachmentResource = itemResources[attachment.itemID];
  30347.             Zotero.RDF.addStatement(resource, n.link+"link", attachmentResource, false);
  30348.             generateItem(attachment, "attachment", attachmentResource);
  30349.         }
  30350.     }
  30351.     
  30352.     // relative file path for attachment items
  30353.     if(item.path) {
  30354.         Zotero.RDF.addStatement(resource, rdf+"resource", item.path, false);
  30355.     }
  30356.     
  30357.     // seeAlso and tags
  30358.     if(item.seeAlso) generateSeeAlso(resource, item.seeAlso);
  30359.     if(item.tags) generateTags(resource, item.tags);
  30360.     
  30361.     for(var property in item.uniqueFields) {
  30362.         var value = item[property];
  30363.         if(!value) continue;
  30364.         
  30365.         if(property == "title") {                    // title
  30366.             Zotero.RDF.addStatement(resource, n.dc+"title", value, true);
  30367.         } else if(property == "source") {            // authors/editors/contributors
  30368.             Zotero.RDF.addStatement(resource, n.dc+"source", value, true);
  30369.         } else if(property == "url") {                // url
  30370.             // add url as identifier
  30371.             var term = Zotero.RDF.newResource();
  30372.             // set term type
  30373.             Zotero.RDF.addStatement(term, rdf+"type", n.dcterms+"URI", false);
  30374.             // set url value
  30375.             Zotero.RDF.addStatement(term, rdf+"value", value, true);
  30376.             // add relationship to resource
  30377.             Zotero.RDF.addStatement(resource, n.dc+"identifier", term, false);
  30378.         } else if(property == "accessionNumber") {    // accessionNumber as generic ID
  30379.             Zotero.RDF.addStatement(resource, n.dc+"identifier", value, true);
  30380.         } else if(property == "rights") {            // rights
  30381.             Zotero.RDF.addStatement(resource, n.dc+"rights", value, true);
  30382.         } else if(property == "edition" ||            // edition
  30383.                   property == "version") {            // version
  30384.             Zotero.RDF.addStatement(resource, n.prism+"edition", value, true);
  30385.         } else if(property == "date") {                // date
  30386.             Zotero.RDF.addStatement(resource, n.dc+"date", value, true);
  30387.         } else if(property == "accessDate") {        // accessDate
  30388.             Zotero.RDF.addStatement(resource, n.dcterms+"dateSubmitted", value, true);
  30389.         } else if(property == "issueDate") {        // issueDate
  30390.             Zotero.RDF.addStatement(resource, n.dcterms+"issued", value, true);
  30391.         } else if(property == "pages") {            // pages
  30392.             // not yet part of biblio, but should be soon
  30393.             Zotero.RDF.addStatement(resource, n.bib+"pages", value, true);
  30394.         } else if(property == "extra") {            // extra
  30395.             Zotero.RDF.addStatement(resource, n.dc+"description", value, true);
  30396.         } else if(property == "mimeType") {            // mimeType
  30397.             Zotero.RDF.addStatement(resource, n.link+"type", value, true);
  30398.         } else if(property == "charset") {            // charset
  30399.             Zotero.RDF.addStatement(resource, n.link+"charset", value, true);
  30400.         // THE FOLLOWING ARE ALL PART OF THE CONTAINER
  30401.         } else if(property == "ISSN") {                // ISSN
  30402.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "ISSN "+value, true);
  30403.         } else if(property == "ISBN") {                // ISBN
  30404.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "ISBN "+value, true);
  30405.         } else if(property == "DOI") {                // DOI
  30406.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "DOI "+value, true);
  30407.         } else if(property == "publicationTitle" ||    // publicationTitle
  30408.                   property == "reporter") {            // reporter
  30409.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"title", value, true);
  30410.         } else if(property == "journalAbbreviation") {    // journalAbbreviation
  30411.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dcterms+"alternative", value, true);
  30412.         } else if(property == "volume") {            // volume
  30413.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.prism+"volume", value, true);
  30414.         } else if(property == "issue" ||            // issue
  30415.                   property == "number" ||            // number
  30416.                   property == "patentNumber") {        // patentNumber
  30417.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.prism+"number", value, true);
  30418.         } else if(property == "callNumber") {
  30419.             var term = Zotero.RDF.newResource();
  30420.             // set term type
  30421.             Zotero.RDF.addStatement(term, rdf+"type", n.dcterms+"LCC", false);
  30422.             // set callNumber value
  30423.             Zotero.RDF.addStatement(term, rdf+"value", value, true);
  30424.             // add relationship to resource
  30425.             Zotero.RDF.addStatement(resource, n.dc+"subject", term, false);
  30426.         } else if(property == "abstractNote") {
  30427.             Zotero.RDF.addStatement(resource, n.dcterms+"abstract", value, true);
  30428.         // THE FOLLOWING ARE ALL PART OF THE SERIES
  30429.         } else if(property == "series") {            // series
  30430.             Zotero.RDF.addStatement(series, n.dc+"title", value, true);
  30431.         } else if(property == "seriesTitle") {        // seriesTitle
  30432.             Zotero.RDF.addStatement(series, n.dcterms+"alternative", value, true);
  30433.         } else if(property == "seriesText") {        // seriesText
  30434.             Zotero.RDF.addStatement(series, n.dc+"description", value, true);
  30435.         } else if(property == "seriesNumber") {        // seriesNumber
  30436.             Zotero.RDF.addStatement(series, n.dc+"identifier", value, true);
  30437.         // THE FOLLOWING ARE ALL PART OF THE PUBLISHER
  30438.         } else if(property == "publisher" ||        // publisher
  30439.                   property == "distributor" ||        // distributor (film)
  30440.                   property == "label" ||            // label (audioRecording)
  30441.                   property == "company" ||            // company (computerProgram)
  30442.                   property == "institution") {        // institution (report)
  30443.             Zotero.RDF.addStatement(organization, n.foaf+"name", value, true);
  30444.         } else if(property == "place") {            // place
  30445.             var address = Zotero.RDF.newResource();
  30446.             // set address type
  30447.             Zotero.RDF.addStatement(address, rdf+"type", n.vcard+"Address", false);
  30448.             // set address locality
  30449.             Zotero.RDF.addStatement(address, n.vcard+"locality", value, true);
  30450.             // add relationship to organization
  30451.             Zotero.RDF.addStatement(organization, n.vcard+"adr", address, false);
  30452.         } else if(property == "archiveLocation") {    // archiveLocation
  30453.             Zotero.RDF.addStatement(resource, n.dc+"coverage", value, true);
  30454.         } else if(property == "interviewMedium" ||
  30455.                   property == "artworkMedium") {    // medium
  30456.             Zotero.RDF.addStatement(resource, n.dcterms+"medium", value, true);
  30457.         } else if(property == "conferenceName") {
  30458.             var conference = Zotero.RDF.newResource();
  30459.             // set conference type
  30460.             Zotero.RDF.addStatement(conference, rdf+"type", n.bib+"Conference", false);
  30461.             // set conference title
  30462.             Zotero.RDF.addStatement(conference, n.dc+"title", value, true);
  30463.             // add relationship to conference
  30464.             Zotero.RDF.addStatement(resource, n.bib+"presentedAt", conference, false);
  30465.         } else if(typeProperties.indexOf(property) != -1) {
  30466.             Zotero.RDF.addStatement(resource, n.dc+"type", value, true);
  30467.         // THE FOLLOWING RELATE TO NOTES
  30468.         } else if(property == "note") {
  30469.             if(Zotero.getOption("exportNotes")) {
  30470.                 if(item.itemType == "attachment") {
  30471.                     Zotero.RDF.addStatement(resource, n.dc+"description", value, true);
  30472.                 } else if(item.itemType == "note") {
  30473.                     Zotero.RDF.addStatement(resource, rdf+"value", value, true);
  30474.                 }
  30475.             }
  30476.         // THIS CATCHES ALL REMAINING PROPERTIES
  30477.         } else if(ignoreProperties.indexOf(property) == -1) {
  30478.             Zotero.debug("Zotero RDF: using Zotero namespace for property "+property);
  30479.             Zotero.RDF.addStatement(resource, n.z+property, value, true);
  30480.         }
  30481.     }
  30482. }
  30483.  
  30484. function doExport() {
  30485.     // add namespaces
  30486.     for(var i in n) {
  30487.         Zotero.RDF.addNamespace(i, n[i]);
  30488.     }
  30489.     
  30490.     // leave as global
  30491.     itemResources = new Array();
  30492.     
  30493.     // keep track of resources already assigned (in case two book items have the
  30494.     // same ISBN, or something like that)
  30495.     var usedResources = new Array();
  30496.     
  30497.     var items = new Array();
  30498.     
  30499.     // first, map each ID to a resource
  30500.     while(item = Zotero.nextItem()) {
  30501.         items.push(item);
  30502.         
  30503.         if(item.ISBN && !usedResources["urn:isbn:"+item.ISBN]) {
  30504.             itemResources[item.itemID] = "urn:isbn:"+item.ISBN;
  30505.             usedResources[itemResources[item.itemID]] = true;
  30506.         } else if(item.itemType != "attachment" && item.url && !usedResources[item.url]) {
  30507.             itemResources[item.itemID] = item.url;
  30508.             usedResources[itemResources[item.itemID]] = true;
  30509.         } else {
  30510.             // just specify a node ID
  30511.             itemResources[item.itemID] = "#item_"+item.itemID;
  30512.         }
  30513.         
  30514.         for(var j in item.notes) {
  30515.             itemResources[item.notes[j].itemID] = "#item_"+item.notes[j].itemID;
  30516.         }
  30517.         
  30518.         for each(var attachment in item.attachments) {
  30519.             // just specify a node ID
  30520.             itemResources[attachment.itemID] = "#item_"+attachment.itemID;
  30521.         }
  30522.     }
  30523.     
  30524.     for each(item in items) {
  30525.         // these items are global
  30526.         generateItem(item, item.itemType, itemResources[item.itemID]);
  30527.     }
  30528.     
  30529.     /** RDF COLLECTION STRUCTURE **/
  30530.     var collection;
  30531.     while(collection = Zotero.nextCollection()) {
  30532.         generateCollection(collection);
  30533.     }
  30534. }');
  30535.  
  30536.  
  30537. REPLACE INTO translators VALUES ('6e372642-ed9d-4934-b5d1-c11ac758ebb7', '1.0.0b3.r1', '', '2006-10-02 17:00:00', 1, 100, 2, 'Unqualified Dublin Core RDF', 'Simon Kornblith', 'rdf',
  30538. 'Zotero.configure("dataMode", "rdf");',
  30539. 'function doExport() {
  30540.     var dc = "http://purl.org/dc/elements/1.1/";
  30541.     Zotero.RDF.addNamespace("dc", dc);
  30542.     
  30543.     var item;
  30544.     while(item = Zotero.nextItem()) {
  30545.         if(item.itemType == "note" || item.itemType == "attachment") {
  30546.             continue;
  30547.         }
  30548.         
  30549.         var resource;
  30550.         if(item.ISBN) {
  30551.             resource = "urn:isbn:"+item.ISBN;
  30552.         } else if(item.url) {
  30553.             resource = item.url;
  30554.         } else {
  30555.             // just specify a node ID
  30556.             resource = Zotero.RDF.newResource();
  30557.         }
  30558.         
  30559.         /** CORE FIELDS **/
  30560.         
  30561.         // title
  30562.         if(item.title) {
  30563.             Zotero.RDF.addStatement(resource, dc+"title", item.title, true);
  30564.         }
  30565.         
  30566.         // type
  30567.         Zotero.RDF.addStatement(resource, dc+"type", item.itemType, true);
  30568.         
  30569.         // creators
  30570.         for(var j in item.creators) {
  30571.             // put creators in lastName, firstName format (although DC doesn''t specify)
  30572.             var creator = item.creators[j].lastName;
  30573.             if(item.creators[j].firstName) {
  30574.                 creator += ", "+item.creators[j].firstName;
  30575.             }
  30576.             
  30577.             if(item.creators[j].creatorType == "author") {
  30578.                 Zotero.RDF.addStatement(resource, dc+"creator", creator, true);
  30579.             } else {
  30580.                 Zotero.RDF.addStatement(resource, dc+"contributor", creator, true);
  30581.             }
  30582.         }
  30583.         
  30584.         /** FIELDS ON NEARLY EVERYTHING BUT NOT A PART OF THE CORE **/
  30585.         
  30586.         // source
  30587.         if(item.source) {
  30588.             Zotero.RDF.addStatement(resource, dc+"source", item.source, true);
  30589.         }
  30590.         
  30591.         // accessionNumber as generic ID
  30592.         if(item.accessionNumber) {
  30593.             Zotero.RDF.addStatement(resource, dc+"identifier", item.accessionNumber, true);
  30594.         }
  30595.         
  30596.         // rights
  30597.         if(item.rights) {
  30598.             Zotero.RDF.addStatement(resource, dc+"rights", item.rights, true);
  30599.         }
  30600.         
  30601.         /** SUPPLEMENTAL FIELDS **/
  30602.         
  30603.         // TODO - create text citation and OpenURL citation to handle volume, number, pages, issue, place
  30604.         
  30605.         // publisher/distributor
  30606.         if(item.publisher) {
  30607.             Zotero.RDF.addStatement(resource, dc+"publisher", item.publisher, true);
  30608.         } else if(item.distributor) {
  30609.             Zotero.RDF.addStatement(resource, dc+"publisher", item.distributor, true);
  30610.         } else if(item.institution) {
  30611.             Zotero.RDF.addStatement(resource, dc+"publisher", item.distributor, true);
  30612.         }
  30613.         
  30614.         // date/year
  30615.         if(item.date) {
  30616.             Zotero.RDF.addStatement(resource, dc+"date", item.date, true);
  30617.         }
  30618.         
  30619.         // ISBN/ISSN/DOI
  30620.         if(item.ISBN) {
  30621.             Zotero.RDF.addStatement(resource, dc+"identifier", "ISBN "+item.ISBN, true);
  30622.         }
  30623.         if(item.ISSN) {
  30624.             Zotero.RDF.addStatement(resource, dc+"identifier", "ISSN "+item.ISSN, true);
  30625.         }
  30626.         if(item.DOI) {
  30627.             Zotero.RDF.addStatement(resource, dc+"identifier", "DOI "+item.DOI, true);
  30628.         }
  30629.         
  30630.         // callNumber
  30631.         if(item.callNumber) {
  30632.             Zotero.RDF.addStatement(resource, dc+"identifier", item.callNumber, true);
  30633.         }
  30634.         
  30635.         // archiveLocation
  30636.         if(item.archiveLocation) {
  30637.             Zotero.RDF.addStatement(resource, dc+"coverage", item.archiveLocation, true);
  30638.         }
  30639.         
  30640.         // medium
  30641.         if(item.medium) {
  30642.             Zotero.RDF.addStatement(resource, dcterms+"medium", item.medium, true);
  30643.         }
  30644.     }
  30645. }');
  30646.  
  30647.  
  30648. REPLACE INTO translators VALUES ('5e3ad958-ac79-463d-812b-a86a9235c28f', '1.0.0b4.r1', '', '2009-01-02 21:15:00', 1, 100, 1, 'RDF', 'Simon Kornblith', 'rdf',
  30649. 'Zotero.configure("dataMode", "rdf");
  30650.  
  30651. function detectImport() {
  30652.     // unfortunately, Mozilla will let you create a data source from any type
  30653.     // of XML, so we need to make sure there are actually nodes
  30654.     
  30655.     var nodes = Zotero.RDF.getAllResources();
  30656.     if(nodes) {
  30657.         return true;
  30658.     }
  30659. }',
  30660.  
  30661. 'var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
  30662.  
  30663. var n = {
  30664.     bib:"http://purl.org/net/biblio#",
  30665.     dc:"http://purl.org/dc/elements/1.1/",
  30666.     dcterms:"http://purl.org/dc/terms/",
  30667.     prism:"http://prismstandard.org/namespaces/1.2/basic/",
  30668.     foaf:"http://xmlns.com/foaf/0.1/",
  30669.     vcard:"http://nwalsh.com/rdf/vCard#",
  30670.     link:"http://purl.org/rss/1.0/modules/link/",
  30671.     z:"http://www.zotero.org/namespaces/export#"
  30672. };
  30673.  
  30674. var callNumberTypes = [n.dcterms+"LCC", n.dcterms+"DDC", n.dcterms+"UDC"];
  30675.  
  30676. var defaultUnknownType = "book";
  30677.  
  30678. // gets the first result set for a property that can be encoded in multiple
  30679. // ontologies
  30680. function getFirstResults(node, properties, onlyOneString) {
  30681.     for(var i=0; i<properties.length; i++) {
  30682.         var result = Zotero.RDF.getTargets(node, properties[i]);
  30683.         if(result) {
  30684.             if(onlyOneString) {
  30685.                 // onlyOneString means we won''t return nsIRDFResources, only
  30686.                 // actual literals
  30687.                 if(typeof(result[0]) != "object") {
  30688.                     return result[0];
  30689.                 }
  30690.             } else {
  30691.                 return result;
  30692.             }
  30693.         }
  30694.     }
  30695.     return;    // return undefined on failure
  30696. }
  30697.  
  30698. // adds creators to an item given a list of creator nodes
  30699. function handleCreators(newItem, creators, creatorType) {
  30700.     if(!creators) {
  30701.         return;
  30702.     }
  30703.     
  30704.     if(typeof(creators[0]) != "string") {    // see if creators are in a container
  30705.         try {
  30706.             var creators = Zotero.RDF.getContainerElements(creators[0]);
  30707.         } catch(e) {}
  30708.     }
  30709.     
  30710.     if(typeof(creators[0]) == "string") {    // support creators encoded as strings
  30711.         for(var i in creators) {
  30712.             if(typeof(creators[i]) != "object") {
  30713.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(creators[i], creatorType, true));
  30714.             }
  30715.         }
  30716.     } else {                                // also support foaf
  30717.         for(var i in creators) {
  30718.             var type = Zotero.RDF.getTargets(creators[i], rdf+"type");
  30719.             if(type) {
  30720.                 type = Zotero.RDF.getResourceURI(type[0]);
  30721.                 if(type == n.foaf+"Person") {    // author is FOAF type person
  30722.                     var creator = new Array();
  30723.                     creator.lastName = getFirstResults(creators[i],
  30724.                         [n.foaf+"surname", n.foaf+"family_name"], true);
  30725.                     creator.firstName = getFirstResults(creators[i],
  30726.                         [n.foaf+"givenname", n.foaf+"firstName"], true);
  30727.                     creator.creatorType = creatorType;
  30728.                     newItem.creators.push(creator);
  30729.                 }
  30730.             }
  30731.         }
  30732.     }
  30733. }
  30734.  
  30735. // processes collections recursively
  30736. function processCollection(node, collection) {
  30737.     if(!collection) {
  30738.         collection = new Array();
  30739.     }
  30740.     collection.type = "collection";
  30741.     collection.name = getFirstResults(node, [n.dc+"title"], true);
  30742.     collection.children = new Array();
  30743.     
  30744.     // check for children
  30745.     var children = getFirstResults(node, [n.dcterms+"hasPart"]);
  30746.     for each(var child in children) {
  30747.         var type = Zotero.RDF.getTargets(child, rdf+"type");
  30748.         if(type) {
  30749.             type = Zotero.RDF.getResourceURI(type[0]);
  30750.         }
  30751.         
  30752.         if(type == n.bib+"Collection" || type == n.z+"Collection") {
  30753.             // for collections, process recursively
  30754.             collection.children.push(processCollection(child));
  30755.         } else {
  30756.             // all other items are added by ID
  30757.             collection.children.push({id:Zotero.RDF.getResourceURI(child), type:"item"});
  30758.         }
  30759.     }
  30760.     
  30761.     return collection;
  30762. }
  30763.  
  30764. function processSeeAlso(node, newItem) {
  30765.     var relations;
  30766.     newItem.itemID = Zotero.RDF.getResourceURI(node);
  30767.     newItem.seeAlso = new Array();
  30768.     if(relations = getFirstResults(node, [n.dc+"relation"])) {
  30769.         for each(var relation in relations) {
  30770.             newItem.seeAlso.push(Zotero.RDF.getResourceURI(relation));
  30771.         }
  30772.     }
  30773. }
  30774.  
  30775. function processTags(node, newItem) {
  30776.     var subjects;
  30777.     newItem.tags = new Array();
  30778.     if(subjects = getFirstResults(node, [n.dc+"subject"])) {
  30779.         for each(var subject in subjects) {
  30780.             if(typeof(subject) == "string") {    // a regular tag
  30781.                 newItem.tags.push(subject);
  30782.             } else {
  30783.                 // a call number
  30784.                 var type = Zotero.RDF.getTargets(subject, rdf+"type");
  30785.                 if(type) {
  30786.                     type = Zotero.RDF.getResourceURI(type[0]);
  30787.                     if(type == n.z+"AutomaticTag") {
  30788.                         newItem.tags.push({tag:getFirstResults(subject, [rdf+"value"], true), type:1});
  30789.                     }
  30790.                 }
  30791.             }
  30792.         }
  30793.     }
  30794. }
  30795.  
  30796. // gets the node with a given type from an array
  30797. function getNodeByType(nodes, type) {
  30798.     if(!nodes) {
  30799.         return false;
  30800.     }
  30801.     
  30802.     for each(var node in nodes) {
  30803.         var nodeType = Zotero.RDF.getTargets(node, rdf+"type");
  30804.         if(nodeType) {
  30805.             nodeType = Zotero.RDF.getResourceURI(nodeType[0]);
  30806.             if(nodeType == type) {    // we have a node of the correct type
  30807.                 return node;
  30808.             }
  30809.         }
  30810.     }
  30811.     return false;
  30812. }
  30813.  
  30814. // returns true if this resource is part of another (related by any arc besides
  30815. // dc:relation or dcterms:hasPart)
  30816. //
  30817. // used to differentiate independent notes and files
  30818. function isPart(node) {
  30819.     var arcs = Zotero.RDF.getArcsIn(node);
  30820.     var skip = false;
  30821.     for each(var arc in arcs) {
  30822.         arc = Zotero.RDF.getResourceURI(arc);
  30823.         if(arc != n.dc+"relation" && arc != n.dcterms+"hasPart") {    
  30824.             // related to another item by some arc besides see also
  30825.             skip = true;
  30826.         }
  30827.     }
  30828.     return skip;
  30829. }
  30830.  
  30831. function importItem(newItem, node, type) {
  30832.     var container = undefined;
  30833.     
  30834.     // also deal with type detection based on parts, so we can differentiate
  30835.     // magazine and journal articles, and find container elements
  30836.     var isPartOf = getFirstResults(node, [n.dcterms+"isPartOf"]);
  30837.     
  30838.     // get parts of parts, because parts are sections of wholes.
  30839.     if(isPartOf) {
  30840.         for(var i=0; i<isPartOf.length; i++) {
  30841.             var subParts = getFirstResults(isPartOf[i], [n.dcterms+"isPartOf"]);
  30842.             if(subParts) {
  30843.                 isPartOf = isPartOf.concat(subParts);
  30844.             }
  30845.         }
  30846.     }
  30847.     
  30848.     if(type) {
  30849.         if(type == n.bib+"Book") {
  30850.             newItem.itemType = "book";
  30851.         } else if(type == n.bib+"BookSection") {
  30852.             newItem.itemType = "bookSection";
  30853.             container = getNodeByType(isPartOf, n.bib+"Book");
  30854.         } else if(type == n.bib+"Article") {    // choose between journal,
  30855.                                                 // newspaper, and magazine
  30856.                                                 // articles
  30857.             // use of container = (not container ==) is intentional
  30858.             if(container = getNodeByType(isPartOf, n.bib+"Journal")) {
  30859.                 newItem.itemType = "journalArticle";
  30860.             } else if(container = getNodeByType(isPartOf, n.bib+"Periodical")) {
  30861.                 newItem.itemType = "magazineArticle";
  30862.             } else if(container = getNodeByType(isPartOf, n.bib+"Newspaper")) {
  30863.                 newItem.itemType = "newspaperArticle";
  30864.             }
  30865.         } else if(type == n.bib+"Thesis") {
  30866.             newItem.itemType = "thesis";
  30867.         } else if(type == n.bib+"Letter") {
  30868.             newItem.itemType = "letter";
  30869.         } else if(type == n.bib+"Manuscript") {
  30870.             newItem.itemType = "manuscript";
  30871.         } else if(type == n.bib+"Interview") {
  30872.             newItem.itemType = "interview";
  30873.         } else if(type == n.bib+"MotionPicture") {
  30874.             newItem.itemType = "film";
  30875.         } else if(type == n.bib+"Illustration") {
  30876.             newItem.itemType = "artwork";
  30877.         } else if(type == n.bib+"Document") {
  30878.             if(container = getNodeByType(isPartOf, n.bib+"CourtReporter")) {
  30879.                 newItem.itemType = "case";
  30880.             } else {
  30881.                 newItem.itemType = "webpage";
  30882.             }
  30883.         } else if(type == n.bib+"Memo") {
  30884.             newItem.itemType = "note";
  30885.         } else if(type == n.z+"Attachment") {
  30886.             // unless processing of independent attachment is intended, don''t
  30887.             // process
  30888.             
  30889.             // process as file
  30890.             newItem.itemType = "attachment";
  30891.  
  30892.             var path = getFirstResults(node, [rdf+"resource"]);
  30893.             if(path) {
  30894.                 newItem.path = Zotero.RDF.getResourceURI(path[0]);
  30895.             }
  30896.             newItem.charset = getFirstResults(node, [n.link+"charset"], true);
  30897.             newItem.mimeType = getFirstResults(node, [n.link+"type"], true);
  30898.         } else if(type == n.bib+"Report") {
  30899.             newItem.itemType = "report";
  30900.         } else if(type == n.bib+"Legislation") {
  30901.             newItem.itemType = "statute";
  30902.         } else if(type == n.bib+"Patent") {
  30903.             newItem.itemType = "patent";
  30904.         } else if(type == n.bib+"Image") {
  30905.             newItem.itemType = "artwork";
  30906.         } else if(type == n.bib+"Recording") {
  30907.             newItem.itemType = "audioRecording";
  30908.         }
  30909.     }
  30910.     
  30911.     // check to see if we recognize the type in the fs or dc namespaces
  30912.     var zoteroType = getFirstResults(node, [n.z+"itemType", n.z+"type", n.dc+"type"], true);
  30913.     if(Zotero.Utilities.itemTypeExists(zoteroType)) {
  30914.         newItem.itemType = zoteroType;
  30915.     }
  30916.     
  30917.     if(newItem.itemType == "blogPost") {
  30918.         container = getNodeByType(isPartOf, n.z+"Blog");
  30919.     } else if(newItem.itemType == "forumPost") {
  30920.         container = getNodeByType(isPartOf, n.z+"Forum");
  30921.     } else if(newItem.itemType == "webpage") {
  30922.         container = getNodeByType(isPartOf, n.z+"Website");
  30923.     }
  30924.     
  30925.     // title
  30926.     newItem.title = getFirstResults(node, [n.dc+"title"], true);
  30927.     if(!newItem.itemType && !newItem.title) {            // require the title
  30928.                                                         // (if not a known type)
  30929.         return false;
  30930.     }
  30931.     
  30932.     if(!newItem.itemType) {
  30933.         newItem.itemType = defaultUnknownType;
  30934.     }
  30935.     
  30936.     // regular author-type creators
  30937.     var possibleCreatorTypes = Zotero.Utilities.getCreatorsForType(newItem.itemType);
  30938.     for each(var creatorType in possibleCreatorTypes) {
  30939.         if(creatorType == "author") {
  30940.             var creators = getFirstResults(node, [n.bib+"authors", n.dc+"creator"]);
  30941.         } else if(creatorType == "editor" || creatorType == "contributor") {
  30942.             var creators = getFirstResults(node, [n.bib+creatorType+"s"]);
  30943.         } else {
  30944.             var creators = getFirstResults(node, [n.z+creatorType+"s"]);
  30945.         }
  30946.         
  30947.         if(creators) handleCreators(newItem, creators, creatorType);
  30948.     }
  30949.     
  30950.     // source
  30951.     newItem.source = getFirstResults(node, [n.dc+"source"], true);
  30952.     
  30953.     // rights
  30954.     newItem.rights = getFirstResults(node, [n.dc+"rights"], true);
  30955.     
  30956.     // section
  30957.     var section = getNodeByType(isPartOf, n.bib+"Part");
  30958.     if(section) {
  30959.         newItem.section = getFirstResults(section, [n.dc+"title"], true);
  30960.     }
  30961.     
  30962.     // publication
  30963.     if(container) {
  30964.         newItem.publicationTitle = getFirstResults(container, [n.dc+"title"], true);
  30965.         // these fields mean the same thing
  30966.         newItem.reporter = newItem.publicationTitle;
  30967.     }
  30968.     
  30969.     // series
  30970.     var series = getNodeByType(isPartOf, n.bib+"Series");
  30971.     if(series) {
  30972.         newItem.series = getFirstResults(series, [n.dc+"title"], true);
  30973.         newItem.seriesTitle = getFirstResults(series, [n.dcterms+"alternative"], true);
  30974.         newItem.seriesText = getFirstResults(series, [n.dc+"description"], true);
  30975.         newItem.seriesNumber = getFirstResults(series, [n.dc+"identifier"], true);
  30976.     }
  30977.     
  30978.     // volume
  30979.     newItem.volume = getFirstResults((container ? container : node), [n.prism+"volume"], true);
  30980.     
  30981.     // issue
  30982.     newItem.issue = getFirstResults((container ? container : node), [n.prism+"number"], true);
  30983.     // these mean the same thing
  30984.     newItem.patentNumber = newItem.number = newItem.issue;
  30985.     
  30986.     // edition
  30987.     newItem.edition = getFirstResults(node, [n.prism+"edition"], true);
  30988.     // these fields mean the same thing
  30989.     newItem.version = newItem.edition;
  30990.     
  30991.     // pages
  30992.     newItem.pages = getFirstResults(node, [n.bib+"pages"], true);
  30993.     
  30994.     // mediums
  30995.     newItem.artworkMedium = newItem.interviewMedium = getFirstResults(node, [n.dcterms+"medium"], true);
  30996.     
  30997.     // publisher
  30998.     var publisher = getFirstResults(node, [n.dc+"publisher"]);
  30999.     if(publisher) {
  31000.         if(typeof(publisher[0]) == "string") {
  31001.             newItem.publisher = publisher[0];
  31002.         } else {
  31003.             var type = Zotero.RDF.getTargets(publisher[0], rdf+"type");
  31004.             if(type) {
  31005.                 type = Zotero.RDF.getResourceURI(type[0]);
  31006.                 if(type == n.foaf+"Organization") {    // handle foaf organizational publishers
  31007.                     newItem.publisher = getFirstResults(publisher[0], [n.foaf+"name"], true);
  31008.                     var place = getFirstResults(publisher[0], [n.vcard+"adr"]);
  31009.                     if(place) {
  31010.                         newItem.place = getFirstResults(place[0], [n.vcard+"locality"]);
  31011.                     }
  31012.                 }
  31013.             }
  31014.         }
  31015.     }
  31016.     
  31017.     // these fields mean the same thing
  31018.     newItem.distributor = newItem.label = newItem.company = newItem.institution = newItem.publisher;
  31019.     
  31020.     // date
  31021.     newItem.date = getFirstResults(node, [n.dc+"date"], true);
  31022.     // accessDate
  31023.     newItem.accessDate = getFirstResults(node, [n.dcterms+"dateSubmitted"], true);
  31024.     // issueDate
  31025.     newItem.issueDate = getFirstResults(node, [n.dcterms+"issued"], true);
  31026.     // lastModified
  31027.     newItem.lastModified = getFirstResults(node, [n.dcterms+"modified"], true);
  31028.     
  31029.     // identifier
  31030.     var identifiers = getFirstResults(node, [n.dc+"identifier"]);
  31031.     if(container) {
  31032.         var containerIdentifiers = getFirstResults(container, [n.dc+"identifier"]);
  31033.         // concatenate sets of identifiers
  31034.         if(containerIdentifiers) {
  31035.             if(identifiers) {
  31036.                 identifiers = identifiers.concat(containerIdentifiers);
  31037.             } else {
  31038.                 identifiers = containerIdentifiers;
  31039.             }
  31040.         }
  31041.     }
  31042.     
  31043.     if(identifiers) {
  31044.         for(var i in identifiers) {
  31045.             if(typeof(identifiers[i]) == "string") {
  31046.                 // grab other things
  31047.                 var beforeSpace = identifiers[i].substr(0, identifiers[i].indexOf(" ")).toUpperCase();
  31048.                 
  31049.                 if(beforeSpace == "ISBN") {
  31050.                     newItem.ISBN = identifiers[i].substr(5).toUpperCase();
  31051.                 } else if(beforeSpace == "ISSN") {
  31052.                     newItem.ISSN = identifiers[i].substr(5).toUpperCase();
  31053.                 } else if(beforeSpace == "DOI") {
  31054.                     newItem.DOI = identifiers[i].substr(4);
  31055.                 } else if(!newItem.accessionNumber) {
  31056.                     newItem.accessionNumber = identifiers[i];
  31057.                 }
  31058.             } else {
  31059.                 // grab URLs
  31060.                 var type = Zotero.RDF.getTargets(identifiers[i], rdf+"type");
  31061.                 if(type && (type = Zotero.RDF.getResourceURI(type[0])) && type == n.dcterms+"URI") {
  31062.                     newItem.url = getFirstResults(identifiers[i], [rdf+"value"], true);
  31063.                 }
  31064.             }
  31065.         }
  31066.     }
  31067.     
  31068.     // archiveLocation
  31069.     newItem.archiveLocation = getFirstResults(node, [n.dc+"coverage"], true);
  31070.     
  31071.     // abstract
  31072.     newItem.abstractNote = getFirstResults(node, [n.dcterms+"abstract"], true);
  31073.     
  31074.     // type
  31075.     var type = getFirstResults(node, [n.dc+"type"], true);
  31076.     // these all mean the same thing
  31077.     var typeProperties = ["reportType", "videoRecordingType", "letterType",
  31078.                         "manuscriptType", "mapType", "thesisType", "websiteType",
  31079.                         "audioRecordingType", "presentationType", "postType",
  31080.                         "audioFileType"];
  31081.     for each(var property in typeProperties) {
  31082.         newItem[property] = type;
  31083.     }
  31084.     
  31085.     // conferenceName
  31086.     var conference = getFirstResults(node, [n.bib+"presentedAt"]);
  31087.     if(conference) {
  31088.         conference = conference[0];
  31089.         if(typeof(conference) == "string") {
  31090.             newItem.conferenceName = conference;
  31091.         } else {
  31092.             newItem.conferenceName = getFirstResults(conference, [n.dc+"title"], true);
  31093.         }
  31094.     }
  31095.     
  31096.     // journalAbbreviation
  31097.     newItem.journalAbbreviation = getFirstResults((container ? container : node), [n.dcterms+"alternative"], true);
  31098.     
  31099.     // see also
  31100.     processSeeAlso(node, newItem);
  31101.     
  31102.     // description/attachment note
  31103.     if(newItem.itemType == "attachment") {
  31104.         newItem.note = getFirstResults(node, [n.dc+"description"], true);
  31105.     } else {
  31106.         newItem.extra = getFirstResults(node, [n.dc+"description"], true);
  31107.     }
  31108.     
  31109.     /** NOTES **/
  31110.     
  31111.     var referencedBy = Zotero.RDF.getTargets(node, n.dcterms+"isReferencedBy");
  31112.     for each(var referentNode in referencedBy) {
  31113.         var type = Zotero.RDF.getTargets(referentNode, rdf+"type");
  31114.         if(type && Zotero.RDF.getResourceURI(type[0]) == n.bib+"Memo") {
  31115.             // if this is a memo
  31116.             var note = new Array();
  31117.             note.note = getFirstResults(referentNode, [rdf+"value", n.dc+"description"], true);
  31118.             if(note.note != undefined) {
  31119.                 // handle see also
  31120.                 processSeeAlso(referentNode, note);
  31121.                 processTags(referentNode, note);
  31122.                 
  31123.                 // add note
  31124.                 newItem.notes.push(note);
  31125.             }
  31126.         }
  31127.     }
  31128.     
  31129.     if(newItem.itemType == "note") {
  31130.         // add note for standalone
  31131.         newItem.note = getFirstResults(node, [rdf+"value", n.dc+"description"], true);
  31132.     }
  31133.     
  31134.     /** TAGS **/
  31135.     
  31136.     var subjects = getFirstResults(node, [n.dc+"subject"]);
  31137.     for each(var subject in subjects) {
  31138.         if(typeof(subject) == "string") {    // a regular tag
  31139.             newItem.tags.push(subject);
  31140.         } else {                            // a call number or automatic tag
  31141.             var type = Zotero.RDF.getTargets(subject, rdf+"type");
  31142.             if(type) {
  31143.                 type = Zotero.RDF.getResourceURI(type[0]);
  31144.                 if(Zotero.Utilities.inArray(type, callNumberTypes)) {
  31145.                     newItem.callNumber = getFirstResults(subject, [rdf+"value"], true);
  31146.                 } else if(type == n.z+"AutomaticTag") {
  31147.                     newItem.tags.push({tag:getFirstResults(subject, [rdf+"value"], true), type:1});
  31148.                 }
  31149.             }
  31150.         }
  31151.     }
  31152.     
  31153.     /** ATTACHMENTS **/
  31154.     var relations = getFirstResults(node, [n.link+"link"]);
  31155.     for each(var relation in relations) {            
  31156.         var type = Zotero.RDF.getTargets(relation, rdf+"type");
  31157.         if(Zotero.RDF.getResourceURI(type[0]) == n.z+"Attachment") {
  31158.             var attachment = new Zotero.Item();
  31159.             newItem.attachments.push(attachment);
  31160.             importItem(attachment, relation, n.z+"Attachment");
  31161.         }
  31162.     }
  31163.     
  31164.     /** OTHER FIELDS **/
  31165.     var arcs = Zotero.RDF.getArcsOut(node);
  31166.     for each(var arc in arcs) {
  31167.         var uri = Zotero.RDF.getResourceURI(arc);
  31168.         if(uri.substr(0, n.z.length) == n.z) {
  31169.             var property = uri.substr(n.z.length);
  31170.             newItem[property] = Zotero.RDF.getTargets(node, n.z+property)[0];
  31171.         }
  31172.     }
  31173.     
  31174.     return true;
  31175. }
  31176.  
  31177. function doImport() {
  31178.     var nodes = Zotero.RDF.getAllResources();
  31179.     if(!nodes) {
  31180.         return false;
  31181.     }
  31182.     
  31183.     // keep track of collections while we''re looping through
  31184.     var collections = new Array();
  31185.     
  31186.     for each(var node in nodes) {
  31187.         var newItem = new Zotero.Item();
  31188.         newItem.itemID = Zotero.RDF.getResourceURI(node);
  31189.         
  31190.         // figure out if this is a part of another resource, or a linked
  31191.         // attachment
  31192.         if(Zotero.RDF.getSources(node, n.dcterms+"isPartOf") ||
  31193.            Zotero.RDF.getSources(node, n.bib+"presentedAt") ||
  31194.            Zotero.RDF.getSources(node, n.link+"link")) {
  31195.             continue;
  31196.         }
  31197.         
  31198.         // type
  31199.         var type = Zotero.RDF.getTargets(node, rdf+"type");
  31200.         if(type) {
  31201.             type = Zotero.RDF.getResourceURI(type[0]);
  31202.             
  31203.             // skip if this is not an independent attachment,
  31204.             if((type == n.z+"Attachment" || type == n.bib+"Memo") && isPart(node)) {
  31205.                 continue;
  31206.             } else if(type == n.bib+"Collection" || type == n.z+"Collection") {
  31207.                 // skip collections until all the items are done
  31208.                 collections.push(node);
  31209.                 continue;
  31210.             }
  31211.         } else {
  31212.             type = false;
  31213.         }
  31214.         
  31215.         if(importItem(newItem, node, type)) {
  31216.             newItem.complete();
  31217.         }
  31218.     }
  31219.     
  31220.     /* COLLECTIONS */
  31221.     
  31222.     for each(var collection in collections) {
  31223.         if(!Zotero.RDF.getArcsIn(collection)) {
  31224.             var newCollection = new Zotero.Collection();
  31225.             processCollection(collection, newCollection);
  31226.             newCollection.complete();
  31227.         }
  31228.     }
  31229. }');
  31230.  
  31231.  
  31232. REPLACE INTO translators VALUES ('32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7', '1.0.2', '', '2008-12-01 18:31:54', '1', '100', '3', 'RIS', 'Simon Kornblith', 'ris', 
  31233. 'Zotero.configure("dataMode", "line");
  31234. Zotero.addOption("exportNotes", true);
  31235. Zotero.addOption("exportCharset", "UTF-8");
  31236.  
  31237. function detectImport() {
  31238.     var line;
  31239.     var i = 0;
  31240.     while((line = Zotero.read()) !== "false") {
  31241.         line = line.replace(/^\s+/, "");
  31242.         if(line != "") {
  31243.             if(line.substr(0, 6).match(/^TY {1,2}- /)) {
  31244.                 return true;
  31245.             } else {
  31246.                 if(i++ > 3) {
  31247.                     return false;
  31248.                 }
  31249.             }
  31250.         }
  31251.     }
  31252. }', 
  31253. 'var fieldMap = {
  31254.     ID:"itemID",
  31255.     T1:"title",
  31256.     T3:"series",
  31257.     JF:"publicationTitle",
  31258.     CY:"place",
  31259.     JA:"journalAbbreviation",
  31260.     M3:"DOI"
  31261. };
  31262.  
  31263. var inputFieldMap = {
  31264.     TI:"title",
  31265.     CT:"title",
  31266.     CY:"place"
  31267. };
  31268.  
  31269. // TODO: figure out if these are the best types for letter, interview, webpage
  31270. var typeMap = {
  31271.     book:"BOOK",
  31272.     bookSection:"CHAP",
  31273.     journalArticle:"JOUR",
  31274.     magazineArticle:"MGZN",
  31275.     newspaperArticle:"NEWS",
  31276.     thesis:"THES",
  31277.     letter:"PCOMM",
  31278.     manuscript:"PAMP",
  31279.     interview:"PCOMM",
  31280.     film:"MPCT",
  31281.     artwork:"ART",
  31282.     report:"RPRT",
  31283.     bill:"BILL",
  31284.     case:"CASE",
  31285.     hearing:"HEAR",
  31286.     patent:"PAT",
  31287.     statute:"STAT",
  31288.     map:"MAP",
  31289.     blogPost:"ELEC",
  31290.     webpage:"ELEC",
  31291.     instantMessage:"ICOMM",
  31292.     forumPost:"ICOMM",
  31293.     email:"ICOMM",
  31294.     audioRecording:"SOUND",
  31295.     presentation:"GEN",
  31296.     videoRecording:"VIDEO",
  31297.     tvBroadcast:"GEN",
  31298.     radioBroadcast:"GEN",
  31299.     podcast:"GEN",
  31300.     computerProgram:"COMP",
  31301.     conferencePaper:"CONF",
  31302.     document:"GEN"
  31303. };
  31304.  
  31305. // supplements outputTypeMap for importing
  31306. // TODO: DATA, MUSIC
  31307. var inputTypeMap = {
  31308.     ABST:"journalArticle",
  31309.     ADVS:"film",
  31310.     CTLG:"magazineArticle",
  31311.     INPR:"manuscript",
  31312.     JFULL:"journalArticle",
  31313.     PAMP:"manuscript",
  31314.     SER:"book",
  31315.     SLIDE:"artwork",
  31316.     UNBILL:"manuscript"
  31317. };
  31318.  
  31319. function processTag(item, tag, value) {
  31320.     if (Zotero.Utilities.unescapeHTML) {
  31321.         value = Zotero.Utilities.unescapeHTML(value.replace("\n", "<br>", "g"));
  31322.     }
  31323.     
  31324.     if(fieldMap[tag]) {
  31325.         item[fieldMap[tag]] = value;
  31326.     } else if(inputFieldMap[tag]) {
  31327.         item[inputFieldMap[tag]] = value;
  31328.     } else if(tag == "TY") {
  31329.         // look for type
  31330.  
  31331.         // first check typeMap
  31332.         for(var i in typeMap) {
  31333.             if(value == typeMap[i]) {
  31334.                 item.itemType = i;
  31335.             }
  31336.         }
  31337.         // then check inputTypeMap
  31338.         if(!item.itemType) {
  31339.             if(inputTypeMap[value]) {
  31340.                 item.itemType = inputTypeMap[value];
  31341.             } else {
  31342.                 // default to generic from inputTypeMap
  31343.                 item.itemType = inputTypeMap["GEN"];
  31344.             }
  31345.         }
  31346.     } else if(tag == "JO") {
  31347.         if (item.itemType == "conferencePaper"){
  31348.             item.conferenceName = value;
  31349.         } else {
  31350.             item.publicationTitle = value;
  31351.         }
  31352.     } else if(tag == "BT") {
  31353.         // ignore, unless this is a book or unpublished work, as per spec
  31354.         if(item.itemType == "book" || item.itemType == "manuscript") {
  31355.             item.title = value;
  31356.         } else {
  31357.             item.backupPublicationTitle = value;
  31358.         }
  31359.     } else if(tag == "T2") {
  31360.         item.backupPublicationTitle = value;
  31361.     } else if(tag == "A1" || tag == "AU") {
  31362.         // primary author (patent: inventor)
  31363.         // store Zotero "creator type" in temporary variable
  31364.         var tempType;
  31365.         if (item.itemType == "patent") {
  31366.             tempType = "inventor";
  31367.         } else {
  31368.             tempType = "author";
  31369.         }
  31370.         var names = value.split(/, ?/);
  31371.         item.creators.push({lastName:names[0], firstName:names[1], creatorType:tempType});
  31372.     } else if(tag == "A2" || tag == "ED") {
  31373.         // contributing author (patent: assignee)
  31374.         if (item.itemType == "patent") {
  31375.             if (item.assignee) {
  31376.                 // Patents can have multiple assignees (applicants) but Zotero only allows a single
  31377.                 // assignee field, so we  have to concatenate them together
  31378.                 item.assignee += ", "+value;
  31379.             } else {
  31380.                 item.assignee =  value;
  31381.             }
  31382.         } else {
  31383.             var names = value.split(/, ?/);
  31384.             item.creators.push({lastName:names[0], firstName:names[1], creatorType:"contributor"});
  31385.         }
  31386.     } else if(tag == "Y1" || tag == "PY") {
  31387.         // year or date
  31388.         var dateParts = value.split("/");
  31389.  
  31390.         if(dateParts.length == 1) {
  31391.             // technically, if there''s only one date part, the file isn''t valid
  31392.             // RIS, but EndNote writes this, so we have to too
  31393.             // Nick: RIS spec example records also only contain a single part
  31394.             // even though it says the slashes are not optional (?)
  31395.             item.date = value;
  31396.         } else {
  31397.             // in the case that we have a year and other data, format that way
  31398.  
  31399.             var month = parseInt(dateParts[1]);
  31400.             if(month) {
  31401.                 month--;
  31402.             } else {
  31403.                 month = undefined;
  31404.             }
  31405.  
  31406.             item.date = Zotero.Utilities.formatDate({year:dateParts[0],
  31407.                                   month:month,
  31408.                                   day:dateParts[2],
  31409.                                   part:dateParts[3]});
  31410.         }
  31411.     } else if(tag == "Y2") {
  31412.         // the secondary date field can mean two things, a secondary date, or an
  31413.         // invalid EndNote-style date. let''s see which one this is.
  31414.         // patent: application (filing) date -- do not append to date field 
  31415.         // for now. Zotero needs a filing date field added to make use of this.
  31416.         var dateParts = value.split("/");
  31417.         if(dateParts.length != 4 && item.itemType != "patent") {
  31418.             // an invalid date and not a patent. 
  31419.             // It''s from EndNote or Delphion (YYYY-MM-DD)
  31420.             if(item.date && value.indexOf(item.date) == -1) {
  31421.                 // append existing year
  31422.                 value += " " + item.date;
  31423.             }
  31424.             item.date = value;
  31425.         } 
  31426.         // ToDo: Handle correctly formatted Y2 fields (secondary date)
  31427.     } else if(tag == "N1" || tag == "AB") {
  31428.         // notes
  31429.         if(value != item.title) {       // why does EndNote do this!?
  31430.             item.notes.push({note:value});
  31431.         }
  31432.     } else if(tag == "N2") {
  31433.         // abstract
  31434.         item.abstractNote = value;
  31435.     } else if(tag == "KW") {
  31436.         // keywords/tags
  31437.         
  31438.         // technically, treating newlines as new tags breaks the RIS spec, but
  31439.         // it''s required to work with EndNote
  31440.         item.tags = item.tags.concat(value.split("\n"));
  31441.     } else if(tag == "SP") {
  31442.         // start page
  31443.         if(!item.pages) {
  31444.             item.pages = value;
  31445.         } else if(item.pages[0] == "-") {       // already have ending page
  31446.             item.pages = value + item.pages;
  31447.         } else {    // multiple ranges? hey, it''s a possibility
  31448.             item.pages += ", "+value;
  31449.         }
  31450.     } else if(tag == "EP") {
  31451.         // end page
  31452.         if(value) {
  31453.             if(!item.pages) {
  31454.                 item.pages = value;
  31455.             } else if(value != item.pages) {
  31456.                 item.pages += "-"+value;
  31457.             }
  31458.         }
  31459.     } else if(tag == "SN") {
  31460.         // ISSN/ISBN - just add both
  31461.         if(!item.ISBN) {
  31462.             item.ISBN = value;
  31463.         }
  31464.         if(!item.ISSN) {
  31465.             item.ISSN = value;
  31466.         }
  31467.     } else if(tag == "UR" || tag == "L1" || tag == "L2" || tag == "L4") {
  31468.         // URL
  31469.         if(!item.url) {
  31470.             item.url = value;
  31471.         }
  31472.         if(tag == "UR") {
  31473.             item.attachments.push({url:value});
  31474.         } else if(tag == "L1") {
  31475.             item.attachments.push({url:value, mimeType:"application/pdf",
  31476.                 title:"Full Text (PDF)", downloadable:true});
  31477.         } else if(tag == "L2") {
  31478.             item.attachments.push({url:value, mimeType:"text/html",
  31479.                 title:"Full Text (HTML)", downloadable:true});
  31480.         } else if(tag == "L4") {
  31481.             item.attachments.push({url:value,
  31482.                 title:"Image", downloadable:true});
  31483.         }
  31484.     } else if (tag == "IS") {
  31485.         // Issue Number (patent: patentNumber)
  31486.         if (item.itemType == "patent") {
  31487.             item.patentNumber = value;
  31488.         } else {
  31489.             item.issue = value;
  31490.         }
  31491.     } else if (tag == "VL") {
  31492.         // Volume Number (patent: applicationNumber)
  31493.         if (item.itemType == "patent") {
  31494.             item.applicationNumber = value;
  31495.         } else {
  31496.             item.volume = value;
  31497.         }
  31498.     } else if (tag == "PB") {
  31499.         // publisher (patent: references)
  31500.         if (item.itemType == "patent") {
  31501.             item.references = value;
  31502.         } else {
  31503.             item.publisher = value;
  31504.         }
  31505.     } else if (tag == "M1" || tag == "M2") {
  31506.         // Miscellaneous fields
  31507.         if (!item.extra) {
  31508.             item.extra = value;
  31509.         } else {
  31510.             item.extra += "; "+value;
  31511.         }
  31512.     }
  31513. }
  31514.  
  31515. function completeItem(item) {
  31516.     // if backup publication title exists but not proper, use backup
  31517.     // (hack to get newspaper titles from EndNote)
  31518.     if(item.backupPublicationTitle) {
  31519.         if(!item.publicationTitle) {
  31520.             item.publicationTitle = item.backupPublicationTitle;
  31521.         }
  31522.         item.backupPublicationTitle = undefined;
  31523.     }
  31524.     // hack for sites like Nature, which only use JA, journal abbreviation
  31525.     if(item.journalAbbreviation && !item.publicationTitle){
  31526.         item.publicationTitle = item.journalAbbreviation;
  31527.     }
  31528.     item.complete();
  31529. }
  31530.  
  31531. function doImport(attachments) {
  31532.     var line = true;
  31533.     var tag = data = false;
  31534.     do {    // first valid line is type
  31535.         line = Zotero.read();
  31536.         line = line.replace(/^\s+/, "");
  31537.     } while(line !== false && !line.substr(0, 6).match(/^TY {1,2}- /));
  31538.  
  31539.     var item = new Zotero.Item();
  31540.     var i = 0;
  31541.     if(attachments && attachments[i]) {
  31542.         item.attachments = attachments[i];
  31543.     }
  31544.  
  31545.     var tag = "TY";
  31546.     
  31547.     // Handle out-of-spec old EndNote exports
  31548.     if (line.substr(0, 5) == "TY - ") {
  31549.         var data = line.substr(5);
  31550.     }
  31551.     else {
  31552.         var data = line.substr(6);
  31553.     }
  31554.     
  31555.     var rawLine;
  31556.     while((rawLine = Zotero.read()) !== false) {    // until EOF
  31557.         // trim leading space if this line is not part of a note
  31558.         line = rawLine.replace(/^\s+/, "");
  31559.         if(line.substr(2, 4) == "  - " || line == "ER  -" || line.substr(0, 5) == "TY - ") {
  31560.             // if this line is a tag, take a look at the previous line to map
  31561.             // its tag
  31562.             if(tag) {
  31563.                 Zotero.debug("tag: ''"+tag+"''; data: ''"+data+"''");
  31564.                 processTag(item, tag, data);
  31565.             }
  31566.  
  31567.             // then fetch the tag and data from this line
  31568.             tag = line.substr(0,2);
  31569.             
  31570.             // Handle out-of-spec old EndNote exports
  31571.             if (line.substr(0, 5) == "TY - ") {
  31572.                 data = line.substr(5);
  31573.             }
  31574.             else {
  31575.                 data = line.substr(6);
  31576.             }
  31577.  
  31578.             if(tag == "ER") {           // ER signals end of reference
  31579.                 // unset info
  31580.                 tag = data = false;
  31581.                 // new item
  31582.                 completeItem(item);
  31583.                 item = new Zotero.Item();
  31584.                 i++;
  31585.                 if(attachments && attachments[i]) {
  31586.                     item.attachments = attachments[i];
  31587.                 }
  31588.             }
  31589.         } else {
  31590.             // otherwise, assume this is data from the previous line continued
  31591.             if(tag == "N1" || tag == "N2" || tag == "AB" || tag == "KW") {
  31592.                 // preserve line endings for N1/N2/AB fields, for EndNote
  31593.                 // compatibility
  31594.                 data += "\n"+rawLine;
  31595.             } else if(tag) {
  31596.                 // otherwise, follow the RIS spec
  31597.                 if(data[data.length-1] == " ") {
  31598.                     data += rawLine;
  31599.                 } else {
  31600.                     data += " "+rawLine;
  31601.                 }
  31602.             }
  31603.         }
  31604.     }
  31605.  
  31606.     if(tag && tag != "ER") {    // save any unprocessed tags
  31607.         Zotero.debug(tag);
  31608.         processTag(item, tag, data);
  31609.         completeItem(item);
  31610.     }
  31611. }
  31612.  
  31613. function addTag(tag, value) {
  31614.     if(value) {
  31615.         Zotero.write(tag+"  - "+value+"\r\n");
  31616.     }
  31617. }
  31618.  
  31619. function doExport() {
  31620.     var item;
  31621.  
  31622.     while(item = Zotero.nextItem()) {
  31623.         // can''t store independent notes in RIS
  31624.         if(item.itemType == "note" || item.itemType == "attachment") {
  31625.             continue;
  31626.         }
  31627.  
  31628.         // type
  31629.         addTag("TY", typeMap[item.itemType] ? typeMap[item.itemType] : "GEN");
  31630.  
  31631.         // use field map
  31632.         for(var j in fieldMap) {
  31633.             if(item[fieldMap[j]]) addTag(j, item[fieldMap[j]]);
  31634.         }
  31635.  
  31636.         // creators
  31637.         for(var j in item.creators) {
  31638.             // only two types, primary and secondary
  31639.             var risTag;
  31640.             // authors and inventors are primary creators
  31641.             if (item.creators[j].creatorType == "author" || item.creators[j].creatorType == "inventor") {
  31642.                 risTag = "A1";
  31643.             } else {
  31644.                 risTag = "A2";
  31645.             }
  31646.  
  31647.             addTag(risTag, item.creators[j].lastName+","+item.creators[j].firstName);
  31648.         }
  31649.         
  31650.         // assignee (patent)
  31651.         if(item.assignee) {
  31652.             addTag("A2", item.assignee);
  31653.         }
  31654.         
  31655.         // volume (patent: applicationNumber)
  31656.         if(item.volume || item.applicationNumber) {
  31657.             var value = (item.volume) ? item.volume : item.applicationNumber;
  31658.             addTag("VL", value);
  31659.         }
  31660.         
  31661.         // issue (patent: patentNumber)
  31662.         if(item.issue || item.patentNumber) {
  31663.             var value = (item.issue) ? item.issue : item.patentNumber;
  31664.             addTag("IS", value);
  31665.         }
  31666.  
  31667.         // publisher (patent: references)
  31668.         if(item.publisher || item.references) {
  31669.             var value = (item.publisher) ? item.publisher : item.references;
  31670.             addTag("PB", value);
  31671.         }
  31672.  
  31673.  
  31674.         // date
  31675.         if(item.date) {
  31676.             var date = Zotero.Utilities.strToDate(item.date);
  31677.             var string = date.year+"/";
  31678.             if(date.month != undefined) {
  31679.                 // deal with javascript months
  31680.                 date.month++;
  31681.                 if(date.month < 10) string += "0";
  31682.                 string += date.month;
  31683.             }
  31684.             string += "/";
  31685.             if(date.day != undefined) {
  31686.                 if(date.day < 10) string += "0";
  31687.                 string += date.day;
  31688.             }
  31689.             string += "/";
  31690.             if(date.part != undefined) {
  31691.                 string += date.part;
  31692.             }
  31693.             addTag("PY", string);
  31694.         }
  31695.  
  31696.         // notes
  31697.         if(Zotero.getOption("exportNotes")) {
  31698.             for(var j in item.notes) {
  31699.                 addTag("N1", item.notes[j].note.replace(/(?:\r\n?|\n)/g, "\r\n"));
  31700.             }
  31701.         }
  31702.  
  31703.         if(item.abstractNote) {
  31704.             addTag("N2", item.abstractNote.replace(/(?:\r\n?|\n)/g, "\r\n"));
  31705.         }
  31706.         else if(item.abstract) {
  31707.             // patent type has abstract
  31708.             addTag("N2", item.abstract.replace(/(?:\r\n?|\n)/g, "\r\n"));
  31709.         }
  31710.  
  31711.         // tags
  31712.         for each(var tag in item.tags) {
  31713.             addTag("KW", tag.tag);
  31714.         }
  31715.  
  31716.         // pages
  31717.         if(item.pages) {
  31718.             if(item.itemType == "book") {
  31719.                 addTag("EP", item.pages);
  31720.             } else {
  31721.                 var range = Zotero.Utilities.getPageRange(item.pages);
  31722.                 addTag("SP", range[0]);
  31723.                 addTag("EP", range[1]);
  31724.             }
  31725.         }
  31726.  
  31727.         // ISBN/ISSN
  31728.         addTag("SN", item.ISBN);
  31729.         addTag("SN", item.ISSN);
  31730.  
  31731.         // URL
  31732.         if(item.url) {
  31733.             addTag("UR", item.url);
  31734.         } else if(item.source && item.source.substr(0, 7) == "http://") {
  31735.             addTag("UR", item.source);
  31736.         }
  31737.  
  31738.         Zotero.write("ER  - \r\n\r\n");
  31739.     }
  31740. }');
  31741.  
  31742. REPLACE INTO translators VALUES ('881f60f2-0802-411a-9228-ce5f47b64c7d', '1.0.0b4.r5', '', '2008-07-24 23:50:00', '1', '100', '3', 'Refer/BibIX', 'Simon Kornblith', 'txt', 
  31743. 'Zotero.configure("dataMode", "line");
  31744. Zotero.addOption("exportCharset", "UTF-8");
  31745.  
  31746. function detectImport() {
  31747.     var lineRe = /%[A-Z0-9\*\$] .+/;
  31748.     var line;
  31749.     var matched = 0;
  31750.     while((line = Zotero.read()) !== "false") {
  31751.         line = line.replace(/^\s+/, "");
  31752.         if(line != "") {
  31753.             if(lineRe.test(line)) {
  31754.                 matched++;
  31755.                 if(matched == 2) {
  31756.                     // threshold is two lines
  31757.                     return true;
  31758.                 }
  31759.             } else {
  31760.                 return false;
  31761.             }
  31762.         }
  31763.     }
  31764. }', 
  31765. 'var fieldMap = {
  31766.     T:"title",
  31767.     S:"series",
  31768.     V:"volume",
  31769.     N:"issue",
  31770.     C:"place",
  31771.     I:"publisher",
  31772.     R:"type",
  31773.     P:"pages",
  31774.     W:"archiveLocation",
  31775.     "*":"rights",
  31776.     "@":"ISBN",
  31777.     L:"callNumber",
  31778.     M:"accessionNumber",
  31779.     U:"url",
  31780.     7:"edition",
  31781.     X:"abstractNote"
  31782. };
  31783.  
  31784. var inputFieldMap = {
  31785.     J:"publicationTitle",
  31786.     B:"publicationTitle",
  31787.     9:"type"
  31788. };
  31789.  
  31790. // TODO: figure out if these are the best types for personal communication
  31791. var typeMap = {
  31792.     book:"Book",
  31793.     bookSection:"Book Section",
  31794.     journalArticle:"Journal Article",
  31795.     magazineArticle:"Magazine Article",
  31796.     newspaperArticle:"Newspaper Article",
  31797.     thesis:"Thesis",
  31798.     letter:"Personal Communication",
  31799.     manuscript:"Unpublished Work",
  31800.     interview:"Personal Communication",
  31801.     film:"Film or Broadcast",
  31802.     artwork:"Artwork",
  31803.     webpage:"Web Page",
  31804.     report:"Report",
  31805.     bill:"Bill",
  31806.     "case":"Case",
  31807.     hearing:"Hearing",
  31808.     patent:"Patent",
  31809.     statute:"Statute",
  31810.     email:"Personal Communication",
  31811.     map:"Map",
  31812.     blogPost:"Web Page",
  31813.     instantMessage:"Personal Communication",
  31814.     forumPost:"Web Page",
  31815.     audioRecording:"Audiovisual Material",
  31816.     presentation:"Report",
  31817.     videoRecording:"Audiovisual Material",
  31818.     tvBroadcast:"Film or Broadcast",
  31819.     radioBroadcast:"Film or Broadcast",
  31820.     podcast:"Audiovisual Material",
  31821.     computerProgram:"Computer Program",
  31822.     conferencePaper:"Conference Paper",
  31823.     document:"Generic",
  31824.     encyclopediaArticle:"Encyclopedia",
  31825.     dictionaryEntry:"Dictionary"
  31826. };
  31827.  
  31828. // supplements outputTypeMap for importing
  31829. // TODO: BILL, CASE, COMP, CONF, DATA, HEAR, MUSIC, PAT, SOUND, STAT
  31830. var inputTypeMap = {
  31831.     "Ancient Text":"book",
  31832.     "Audiovisual Material":"videoRecording",
  31833.     "Generic":"book",
  31834.     "Chart or Table":"artwork",
  31835.     "Classical Work":"book",
  31836.     "Conference Proceedings":"conferencePaper",
  31837.     "Conference Paper":"conferencePaper",
  31838.     "Edited Book":"book",
  31839.     "Electronic Article":"journalArticle",
  31840.     "Electronic Book":"book",
  31841.     "Equation":"artwork",
  31842.     "Figure":"artwork",
  31843.     "Government Document":"document",
  31844.     "Grant":"document",
  31845.     "Legal Rule or Regulation":"statute",
  31846.     "Online Database":"webpage",
  31847.     "Online Multimedia":"webpage",
  31848.     "Electronic Source":"webpage"
  31849. };
  31850.  
  31851. var isEndNote = false;
  31852.  
  31853. function processTag(item, tag, value) {
  31854.     value = Zotero.Utilities.trim(value);
  31855.     if(fieldMap[tag]) {
  31856.         item[fieldMap[tag]] = value;
  31857.     } else if(inputFieldMap[tag]) {
  31858.         item[inputFieldMap[tag]] = value;
  31859.     } else if(tag == "0") {
  31860.         if(inputTypeMap[value]) {    // first check inputTypeMap
  31861.             item.itemType = inputTypeMap[value]
  31862.         } else {                    // then check typeMap
  31863.             for(var i in typeMap) {
  31864.                 if(value == typeMap[i]) {
  31865.                     item.itemType = i;
  31866.                     break;
  31867.                 }
  31868.             }
  31869.             // fall back to generic
  31870.             if(!item.itemType) item.itemType = inputTypeMap["Generic"];
  31871.         }
  31872.     } else if(tag == "A" || tag == "E" || tag == "?") {
  31873.         if(tag == "A") {
  31874.             var type = "author";
  31875.         } else if(tag == "E") {
  31876.             var type = "editor";
  31877.         } else if(tag == "?") {
  31878.             var type = "translator";
  31879.         }
  31880.         
  31881.         item.creators.push(Zotero.Utilities.cleanAuthor(value, type, value.indexOf(",") != -1));
  31882.     } else if(tag == "Q") {
  31883.         item.creators.push({creatorType:"author", lastName:value, fieldMode:true});
  31884.     } else if(tag == "H" || tag == "O") {
  31885.         item.extra += "\n"+value;
  31886.     } else if(tag == "Z") {
  31887.         item.notes.push({note:value});
  31888.     } else if(tag == "D") {
  31889.         if(item.date) {
  31890.             if(item.date.indexOf(value) == -1) {
  31891.                 item.date += " "+value;
  31892.             }
  31893.         } else {
  31894.             item.date = value;
  31895.         }
  31896.     } else if(tag == "8") {
  31897.         if(item.date) {
  31898.             if(value.indexOf(item.date) == -1) {
  31899.                 item.date += " "+value;
  31900.             }
  31901.         } else {
  31902.             item.date = value;
  31903.         }
  31904.     } else if(tag == "K") {
  31905.         item.tags = value.split("\n");
  31906.     }
  31907. }
  31908.  
  31909. function doImport() {
  31910.     var line = true;
  31911.     var tag = data = false;
  31912.     do {    // first valid line is type
  31913.         Zotero.debug("ignoring "+line);
  31914.         line = Zotero.read();
  31915.         line = line.replace(/^\s+/, "");
  31916.     } while(line !== false && line[0] != "%");
  31917.     
  31918.     var item = new Zotero.Item();
  31919.     
  31920.     var tag = line[1];
  31921.     var data = line.substr(3);
  31922.     while((line = Zotero.read()) !== false) {    // until EOF
  31923.         line = line.replace(/^\s+/, "");
  31924.         if(!line) {
  31925.             if(tag) {
  31926.                 processTag(item, tag, data);
  31927.                 // unset info
  31928.                 tag = data = readRecordEntry = false;
  31929.                 // new item
  31930.                 item.complete();
  31931.                 item = new Zotero.Item();
  31932.             }
  31933.         } else if(line[0] == "%" && line[2] == " ") {
  31934.             // if this line is a tag, take a look at the previous line to map
  31935.             // its tag
  31936.             if(tag) {
  31937.                 processTag(item, tag, data);
  31938.             }
  31939.             
  31940.             // then fetch the tag and data from this line
  31941.             tag = line[1];
  31942.             data = line.substr(3);
  31943.         } else {
  31944.             // otherwise, assume this is data from the previous line continued
  31945.             if(tag) {
  31946.                 data += "\n"+line;
  31947.             }
  31948.         }
  31949.     }
  31950.     
  31951.     if(tag) {    // save any unprocessed tags
  31952.         processTag(item, tag, data);
  31953.         item.complete();
  31954.     }
  31955. }
  31956.  
  31957. function addTag(tag, value) {
  31958.     if(value) {
  31959.         Zotero.write("%"+tag+" "+value+"\r\n");
  31960.     }
  31961. }
  31962.  
  31963. function doExport() {
  31964.     var item;
  31965.     while(item = Zotero.nextItem()) {
  31966.         // can''t store independent notes in RIS
  31967.         if(item.itemType == "note" || item.itemType == "attachment") {
  31968.             continue;
  31969.         }
  31970.         
  31971.         // type
  31972.         addTag("0", typeMap[item.itemType] ? typeMap[item.itemType] : "Generic");
  31973.         
  31974.         // use field map
  31975.         for(var j in fieldMap) {
  31976.             if(item[fieldMap[j]]) addTag(j, item[fieldMap[j]]);
  31977.         }
  31978.         
  31979.         //handle J & B tags correctly
  31980.         if (item["publicationTitle"]) {
  31981.             if (item.itemType == "journalArticle") {
  31982.                 addTag("J", item["publicationTitle"]);
  31983.             } else {
  31984.                 addTag("B", item["publicationTitle"]);
  31985.             }
  31986.         }
  31987.         
  31988.         // creators
  31989.         for(var j in item.creators) {
  31990.             var referTag = "A";
  31991.             if(item.creators[j].creatorType == "editor") {
  31992.                 referTag = "E";
  31993.             } else if(item.creators[j].creatorType == "translator") {
  31994.                 referTag = "?";
  31995.             }
  31996.             
  31997.             addTag(referTag, item.creators[j].lastName+(item.creators[j].firstName ? ", "+item.creators[j].firstName : ""));
  31998.         }
  31999.         
  32000.         // date
  32001.         addTag("D", item.date);
  32002.         
  32003.         // tags
  32004.         if(item.tags) {
  32005.             var keywordTag = "";
  32006.             for each(var tag in item.tags) {
  32007.                 keywordTag += "\r\n"+tag.tag;
  32008.             }
  32009.             addTag("K", keywordTag.substr(2));
  32010.         }
  32011.         Zotero.write("\r\n");
  32012.     }
  32013. }');
  32014.  
  32015.  
  32016. REPLACE INTO translators VALUES ('9cb70025-a888-4a29-a210-93ec52da40d4', '1.0.0b4.r1', '', '2009-01-12 19:00:00', 1, 200, 3, 'BibTeX', 'Simon Kornblith', 'bib',
  32017. 'Zotero.configure("dataMode", "block");
  32018. Zotero.addOption("exportCharset", "UTF-8");
  32019.  
  32020. function detectImport() {
  32021.     var maxChars = 1048576; // 1MB
  32022.     
  32023.     var inComment = false;
  32024.     var block = "";
  32025.     var buffer = "";
  32026.     var chr = "";
  32027.     var charsRead = 0;
  32028.     
  32029.     var re = /^\s*@[a-zA-Z]+[\(\{]/;
  32030.     while((buffer = Zotero.read(4096)) && charsRead < maxChars) {
  32031.         Zotero.debug("Scanning " + buffer.length + " characters for BibTeX");
  32032.         charsRead += buffer.length;
  32033.         for (var i=0; i<buffer.length; i++) {
  32034.             chr = buffer[i];
  32035.             
  32036.             if (inComment && chr != "\r" && chr != "\n") {
  32037.                 continue;
  32038.             }
  32039.             inComment = false;
  32040.             
  32041.             if(chr == "%") {
  32042.                 // read until next newline
  32043.                 block = "";
  32044.                 inComment = true;
  32045.             } else if((chr == "\n" || chr == "\r") && block) {
  32046.                 // check if this is a BibTeX entry
  32047.                 if(re.test(block)) {
  32048.                     return true;
  32049.                 }
  32050.                 
  32051.                 block = "";
  32052.             } else if(" \n\r\t".indexOf(chr) == -1) {
  32053.                 block += chr;
  32054.             }
  32055.         }
  32056.     }
  32057. }',
  32058. '//%a = first author surname
  32059. //%y = year
  32060. //%t = first word of title
  32061. var citeKeyFormat = "%a_%t_%y";
  32062.  
  32063. var fieldMap = {
  32064.     address:"place",
  32065.     chapter:"section",
  32066.     edition:"edition",
  32067. //    number:"issue",
  32068.     type:"type",
  32069.     series:"series",
  32070.     title:"title",
  32071.     volume:"volume",
  32072.     copyright:"rights",
  32073.     isbn:"ISBN",
  32074.     issn:"ISSN",
  32075.     lccn:"callNumber",
  32076.     location:"archiveLocation",
  32077.     url:"url",
  32078.     doi:"DOI",
  32079.     "abstract":"abstractNote"
  32080. };
  32081.  
  32082. var inputFieldMap = {
  32083.     booktitle :"publicationTitle",
  32084.     school:"publisher",
  32085.     institution:"publisher",
  32086.     publisher:"publisher"
  32087. };
  32088.  
  32089. var zotero2bibtexTypeMap = {
  32090.     "book":"book",
  32091.     "bookSection": function (item) {
  32092.         var hasAuthor = false;
  32093.         var hasEditor = false;
  32094.         for each(var creator in item.creators) {
  32095.             if (creator.creatorType == "editor") { hasEditor = true; }
  32096.             if (creator.creatorType == "author") { hasAuthor = true; }
  32097.         }
  32098.         if (hasAuthor && hasEditor) { return "incollection"; }
  32099.         return "inbook";
  32100.         },
  32101.     "journalArticle":"article",
  32102.     "magazineArticle":"article",
  32103.     "newspaperArticle":"article",
  32104.     "thesis":"phdthesis",
  32105.     "letter":"misc",
  32106.     "manuscript":"unpublished",
  32107.     "interview":"misc",
  32108.     "film":"misc",
  32109.     "artwork":"misc",
  32110.     "webpage":"misc",
  32111.     "conferencePaper":"inproceedings",
  32112.     "report":"techreport"
  32113. };
  32114.  
  32115. var bibtex2zoteroTypeMap = {
  32116.     "book":"book", // or booklet, proceedings
  32117.     "inbook":"bookSection",
  32118.     "incollection":"bookSection",
  32119.     "article":"journalArticle", // or magazineArticle or newspaperArticle
  32120.     "phdthesis":"thesis",
  32121.     "unpublished":"manuscript",
  32122.     "inproceedings":"conferencePaper", // check for conference also
  32123.     "conference":"conferencePaper",
  32124.     "techreport":"report",
  32125.     "booklet":"book",
  32126.     "incollection":"bookSection",
  32127.     "manual":"book",
  32128.     "mastersthesis":"thesis",
  32129.     "misc":"book",
  32130.     "proceedings":"book"
  32131. };
  32132.  
  32133. /*
  32134.  * three-letter month abbreviations. i assume these are the same ones that the
  32135.  * docs say are defined in some appendix of the LaTeX book. (i don''t have the
  32136.  * LaTeX book.)
  32137.  */
  32138. var months = ["jan", "feb", "mar", "apr", "may", "jun",
  32139.               "jul", "aug", "sep", "oct", "nov", "dec"]
  32140.  
  32141. /*
  32142.  * new mapping table based on that from Matthias Steffens,
  32143.  * then enhanced with some fields generated from the unicode table.
  32144.  */
  32145.  
  32146. var mappingTable = {
  32147.     "\u00A0":"~", // NO-BREAK SPACE
  32148.     "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK
  32149.     "\u00A2":"{\\textcent}", // CENT SIGN
  32150.     "\u00A3":"{\\textsterling}", // POUND SIGN
  32151.     "\u00A5":"{\\textyen}", // YEN SIGN
  32152.     "\u00A6":"{\\textbrokenbar}", // BROKEN BAR
  32153.     "\u00A7":"{\\textsection}", // SECTION SIGN
  32154.     "\u00A8":"{\\textasciidieresis}", // DIAERESIS
  32155.     "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN
  32156.     "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR
  32157.     "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  32158.     "\u00AC":"{\\textlnot}", // NOT SIGN
  32159.     "\u00AD":"-", // SOFT HYPHEN
  32160.     "\u00AE":"{\\textregistered}", // REGISTERED SIGN
  32161.     "\u00AF":"{\\textasciimacron}", // MACRON
  32162.     "\u00B0":"{\\textdegree}", // DEGREE SIGN
  32163.     "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN
  32164.     "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO
  32165.     "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE
  32166.     "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT
  32167.     "\u00B5":"{\\textmu}", // MICRO SIGN
  32168.     "\u00B6":"{\\textparagraph}", // PILCROW SIGN
  32169.     "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT
  32170.     "\u00B8":"{\\c\\ }", // CEDILLA
  32171.     "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE
  32172.     "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR
  32173.     "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  32174.     "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER
  32175.     "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF
  32176.     "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS
  32177.     "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK
  32178.     "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE
  32179.     "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH
  32180.     "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN
  32181.     "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN
  32182.     "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S
  32183.     "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE
  32184.     "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH
  32185.     "\u00F7":"{\\textdiv}", // DIVISION SIGN
  32186.     "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN
  32187.     "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I
  32188.     "\u0132":"IJ", // LATIN CAPITAL LIGATURE IJ
  32189.     "\u0133":"ij", // LATIN SMALL LIGATURE IJ
  32190.     "\u0138":"k", // LATIN SMALL LETTER KRA
  32191.     "\u0149":"''n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  32192.     "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG
  32193.     "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG
  32194.     "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE
  32195.     "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE
  32196.     "\u017F":"s", // LATIN SMALL LETTER LONG S
  32197.     "\u02B9":"''", // MODIFIER LETTER PRIME
  32198.     "\u02BB":"''", // MODIFIER LETTER TURNED COMMA
  32199.     "\u02BC":"''", // MODIFIER LETTER APOSTROPHE
  32200.     "\u02BD":"''", // MODIFIER LETTER REVERSED COMMA
  32201.     "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT
  32202.     "\u02C8":"''", // MODIFIER LETTER VERTICAL LINE
  32203.     "\u02C9":"-", // MODIFIER LETTER MACRON
  32204.     "\u02CC":",", // MODIFIER LETTER LOW VERTICAL LINE
  32205.     "\u02D0":":", // MODIFIER LETTER TRIANGULAR COLON
  32206.     "\u02DA":"o", // RING ABOVE
  32207.     "\u02DC":"\\~{}", // SMALL TILDE
  32208.     "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT
  32209.     "\u0374":"''", // GREEK NUMERAL SIGN
  32210.     "\u0375":",", // GREEK LOWER NUMERAL SIGN
  32211.     "\u037E":";", // GREEK QUESTION MARK
  32212.     "\u2000":" ", // EN QUAD
  32213.     "\u2001":"  ", // EM QUAD
  32214.     "\u2002":" ", // EN SPACE
  32215.     "\u2003":"  ", // EM SPACE
  32216.     "\u2004":" ", // THREE-PER-EM SPACE
  32217.     "\u2005":" ", // FOUR-PER-EM SPACE
  32218.     "\u2006":" ", // SIX-PER-EM SPACE
  32219.     "\u2007":" ", // FIGURE SPACE
  32220.     "\u2008":" ", // PUNCTUATION SPACE
  32221.     "\u2009":" ", // THIN SPACE
  32222.     "\u2010":"-", // HYPHEN
  32223.     "\u2011":"-", // NON-BREAKING HYPHEN
  32224.     "\u2012":"-", // FIGURE DASH
  32225.     "\u2013":"{\\textendash}", // EN DASH
  32226.     "\u2014":"{\\textemdash}", // EM DASH
  32227.     "\u2015":"{\\textemdash}", // HORIZONTAL BAR or QUOTATION DASH (not in LaTeX -- use EM DASH)
  32228.     "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE
  32229.     "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE
  32230.     "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK
  32231.     "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK
  32232.     "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK
  32233.     "\u201B":"''", // SINGLE HIGH-REVERSED-9 QUOTATION MARK
  32234.     "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK
  32235.     "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK
  32236.     "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK
  32237.     "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  32238.     "\u2020":"{\\textdagger}", // DAGGER
  32239.     "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER
  32240.     "\u2022":"{\\textbullet}", // BULLET
  32241.     "\u2023":">", // TRIANGULAR BULLET
  32242.     "\u2024":".", // ONE DOT LEADER
  32243.     "\u2025":"..", // TWO DOT LEADER
  32244.     "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS
  32245.     "\u2027":"-", // HYPHENATION POINT
  32246.     "\u202F":" ", // NARROW NO-BREAK SPACE
  32247.     "\u2030":"{\\textperthousand}", // PER MILLE SIGN
  32248.     "\u2032":"''", // PRIME
  32249.     "\u2033":"''", // DOUBLE PRIME
  32250.     "\u2034":"''''''", // TRIPLE PRIME
  32251.     "\u2035":"`", // REVERSED PRIME
  32252.     "\u2036":"``", // REVERSED DOUBLE PRIME
  32253.     "\u2037":"```", // REVERSED TRIPLE PRIME
  32254.     "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
  32255.     "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
  32256.     "\u203C":"!!", // DOUBLE EXCLAMATION MARK
  32257.     "\u203E":"-", // OVERLINE
  32258.     "\u2043":"-", // HYPHEN BULLET
  32259.     "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH
  32260.     "\u2048":"?!", // QUESTION EXCLAMATION MARK
  32261.     "\u2049":"!?", // EXCLAMATION QUESTION MARK
  32262.     "\u204A":"7", // TIRONIAN SIGN ET
  32263.     "\u2070":"$^{0}$", // SUPERSCRIPT ZERO
  32264.     "\u2074":"$^{4}$", // SUPERSCRIPT FOUR
  32265.     "\u2075":"$^{5}$", // SUPERSCRIPT FIVE
  32266.     "\u2076":"$^{6}$", // SUPERSCRIPT SIX
  32267.     "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN
  32268.     "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT
  32269.     "\u2079":"$^{9}$", // SUPERSCRIPT NINE
  32270.     "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN
  32271.     "\u207B":"$^{-}$", // SUPERSCRIPT MINUS
  32272.     "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN
  32273.     "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS
  32274.     "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS
  32275.     "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N
  32276.     "\u2080":"$_{0}$", // SUBSCRIPT ZERO
  32277.     "\u2081":"$_{1}$", // SUBSCRIPT ONE
  32278.     "\u2082":"$_{2}$", // SUBSCRIPT TWO
  32279.     "\u2083":"$_{3}$", // SUBSCRIPT THREE
  32280.     "\u2084":"$_{4}$", // SUBSCRIPT FOUR
  32281.     "\u2085":"$_{5}$", // SUBSCRIPT FIVE
  32282.     "\u2086":"$_{6}$", // SUBSCRIPT SIX
  32283.     "\u2087":"$_{7}$", // SUBSCRIPT SEVEN
  32284.     "\u2088":"$_{8}$", // SUBSCRIPT EIGHT
  32285.     "\u2089":"$_{9}$", // SUBSCRIPT NINE
  32286.     "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN
  32287.     "\u208B":"$_{-}$", // SUBSCRIPT MINUS
  32288.     "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN
  32289.     "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS
  32290.     "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS
  32291.     "\u20AC":"{\\texteuro}", // EURO SIGN
  32292.     "\u2100":"a/c", // ACCOUNT OF
  32293.     "\u2101":"a/s", // ADDRESSED TO THE SUBJECT
  32294.     "\u2103":"{\\textcelsius}", // DEGREE CELSIUS
  32295.     "\u2105":"c/o", // CARE OF
  32296.     "\u2106":"c/u", // CADA UNA
  32297.     "\u2109":"F", // DEGREE FAHRENHEIT
  32298.     "\u2113":"l", // SCRIPT SMALL L
  32299.     "\u2116":"{\\textnumero}", // NUMERO SIGN
  32300.     "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT
  32301.     "\u2120":"{\\textservicemark}", // SERVICE MARK
  32302.     "\u2121":"TEL", // TELEPHONE SIGN
  32303.     "\u2122":"{\\texttrademark}", // TRADE MARK SIGN
  32304.     "\u2126":"{\\textohm}", // OHM SIGN
  32305.     "\u212A":"K", // KELVIN SIGN
  32306.     "\u212B":"A", // ANGSTROM SIGN
  32307.     "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL
  32308.     "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD
  32309.     "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS
  32310.     "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH
  32311.     "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS
  32312.     "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS
  32313.     "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS
  32314.     "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH
  32315.     "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS
  32316.     "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH
  32317.     "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS
  32318.     "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS
  32319.     "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS
  32320.     "\u215F":" 1/", // FRACTION NUMERATOR ONE
  32321.     "\u2160":"I", // ROMAN NUMERAL ONE
  32322.     "\u2161":"II", // ROMAN NUMERAL TWO
  32323.     "\u2162":"III", // ROMAN NUMERAL THREE
  32324.     "\u2163":"IV", // ROMAN NUMERAL FOUR
  32325.     "\u2164":"V", // ROMAN NUMERAL FIVE
  32326.     "\u2165":"VI", // ROMAN NUMERAL SIX
  32327.     "\u2166":"VII", // ROMAN NUMERAL SEVEN
  32328.     "\u2167":"VIII", // ROMAN NUMERAL EIGHT
  32329.     "\u2168":"IX", // ROMAN NUMERAL NINE
  32330.     "\u2169":"X", // ROMAN NUMERAL TEN
  32331.     "\u216A":"XI", // ROMAN NUMERAL ELEVEN
  32332.     "\u216B":"XII", // ROMAN NUMERAL TWELVE
  32333.     "\u216C":"L", // ROMAN NUMERAL FIFTY
  32334.     "\u216D":"C", // ROMAN NUMERAL ONE HUNDRED
  32335.     "\u216E":"D", // ROMAN NUMERAL FIVE HUNDRED
  32336.     "\u216F":"M", // ROMAN NUMERAL ONE THOUSAND
  32337.     "\u2170":"i", // SMALL ROMAN NUMERAL ONE
  32338.     "\u2171":"ii", // SMALL ROMAN NUMERAL TWO
  32339.     "\u2172":"iii", // SMALL ROMAN NUMERAL THREE
  32340.     "\u2173":"iv", // SMALL ROMAN NUMERAL FOUR
  32341.     "\u2174":"v", // SMALL ROMAN NUMERAL FIVE
  32342.     "\u2175":"vi", // SMALL ROMAN NUMERAL SIX
  32343.     "\u2176":"vii", // SMALL ROMAN NUMERAL SEVEN
  32344.     "\u2177":"viii", // SMALL ROMAN NUMERAL EIGHT
  32345.     "\u2178":"ix", // SMALL ROMAN NUMERAL NINE
  32346.     "\u2179":"x", // SMALL ROMAN NUMERAL TEN
  32347.     "\u217A":"xi", // SMALL ROMAN NUMERAL ELEVEN
  32348.     "\u217B":"xii", // SMALL ROMAN NUMERAL TWELVE
  32349.     "\u217C":"l", // SMALL ROMAN NUMERAL FIFTY
  32350.     "\u217D":"c", // SMALL ROMAN NUMERAL ONE HUNDRED
  32351.     "\u217E":"d", // SMALL ROMAN NUMERAL FIVE HUNDRED
  32352.     "\u217F":"m", // SMALL ROMAN NUMERAL ONE THOUSAND
  32353.     "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW
  32354.     "\u2191":"{\\textuparrow}", // UPWARDS ARROW
  32355.     "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW
  32356.     "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW
  32357.     "\u2194":"<->", // LEFT RIGHT ARROW
  32358.     "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW
  32359.     "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW
  32360.     "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW
  32361.     "\u2212":"-", // MINUS SIGN
  32362.     "\u2215":"/", // DIVISION SLASH
  32363.     "\u2216":"\\", // SET MINUS
  32364.     "\u2217":"*", // ASTERISK OPERATOR
  32365.     "\u2218":"o", // RING OPERATOR
  32366.     "\u2219":".", // BULLET OPERATOR
  32367.     "\u221E":"$\\infty$", // INFINITY
  32368.     "\u2223":"|", // DIVIDES
  32369.     "\u2225":"||", // PARALLEL TO
  32370.     "\u2236":":", // RATIO
  32371.     "\u223C":"\\~{}", // TILDE OPERATOR
  32372.     "\u2260":"/=", // NOT EQUAL TO
  32373.     "\u2261":"=", // IDENTICAL TO
  32374.     "\u2264":"<=", // LESS-THAN OR EQUAL TO
  32375.     "\u2265":">=", // GREATER-THAN OR EQUAL TO
  32376.     "\u226A":"<<", // MUCH LESS-THAN
  32377.     "\u226B":">>", // MUCH GREATER-THAN
  32378.     "\u2295":"(+)", // CIRCLED PLUS
  32379.     "\u2296":"(-)", // CIRCLED MINUS
  32380.     "\u2297":"(x)", // CIRCLED TIMES
  32381.     "\u2298":"(/)", // CIRCLED DIVISION SLASH
  32382.     "\u22A2":"|-", // RIGHT TACK
  32383.     "\u22A3":"-|", // LEFT TACK
  32384.     "\u22A6":"|-", // ASSERTION
  32385.     "\u22A7":"|=", // MODELS
  32386.     "\u22A8":"|=", // TRUE
  32387.     "\u22A9":"||-", // FORCES
  32388.     "\u22C5":".", // DOT OPERATOR
  32389.     "\u22C6":"*", // STAR OPERATOR
  32390.     "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO
  32391.     "\u22D8":"<<<", // VERY MUCH LESS-THAN
  32392.     "\u22D9":">>>", // VERY MUCH GREATER-THAN
  32393.     "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET
  32394.     "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET
  32395.     "\u2400":"NUL", // SYMBOL FOR NULL
  32396.     "\u2401":"SOH", // SYMBOL FOR START OF HEADING
  32397.     "\u2402":"STX", // SYMBOL FOR START OF TEXT
  32398.     "\u2403":"ETX", // SYMBOL FOR END OF TEXT
  32399.     "\u2404":"EOT", // SYMBOL FOR END OF TRANSMISSION
  32400.     "\u2405":"ENQ", // SYMBOL FOR ENQUIRY
  32401.     "\u2406":"ACK", // SYMBOL FOR ACKNOWLEDGE
  32402.     "\u2407":"BEL", // SYMBOL FOR BELL
  32403.     "\u2408":"BS", // SYMBOL FOR BACKSPACE
  32404.     "\u2409":"HT", // SYMBOL FOR HORIZONTAL TABULATION
  32405.     "\u240A":"LF", // SYMBOL FOR LINE FEED
  32406.     "\u240B":"VT", // SYMBOL FOR VERTICAL TABULATION
  32407.     "\u240C":"FF", // SYMBOL FOR FORM FEED
  32408.     "\u240D":"CR", // SYMBOL FOR CARRIAGE RETURN
  32409.     "\u240E":"SO", // SYMBOL FOR SHIFT OUT
  32410.     "\u240F":"SI", // SYMBOL FOR SHIFT IN
  32411.     "\u2410":"DLE", // SYMBOL FOR DATA LINK ESCAPE
  32412.     "\u2411":"DC1", // SYMBOL FOR DEVICE CONTROL ONE
  32413.     "\u2412":"DC2", // SYMBOL FOR DEVICE CONTROL TWO
  32414.     "\u2413":"DC3", // SYMBOL FOR DEVICE CONTROL THREE
  32415.     "\u2414":"DC4", // SYMBOL FOR DEVICE CONTROL FOUR
  32416.     "\u2415":"NAK", // SYMBOL FOR NEGATIVE ACKNOWLEDGE
  32417.     "\u2416":"SYN", // SYMBOL FOR SYNCHRONOUS IDLE
  32418.     "\u2417":"ETB", // SYMBOL FOR END OF TRANSMISSION BLOCK
  32419.     "\u2418":"CAN", // SYMBOL FOR CANCEL
  32420.     "\u2419":"EM", // SYMBOL FOR END OF MEDIUM
  32421.     "\u241A":"SUB", // SYMBOL FOR SUBSTITUTE
  32422.     "\u241B":"ESC", // SYMBOL FOR ESCAPE
  32423.     "\u241C":"FS", // SYMBOL FOR FILE SEPARATOR
  32424.     "\u241D":"GS", // SYMBOL FOR GROUP SEPARATOR
  32425.     "\u241E":"RS", // SYMBOL FOR RECORD SEPARATOR
  32426.     "\u241F":"US", // SYMBOL FOR UNIT SEPARATOR
  32427.     "\u2420":"SP", // SYMBOL FOR SPACE
  32428.     "\u2421":"DEL", // SYMBOL FOR DELETE
  32429.     "\u2423":"{\\textvisiblespace}", // OPEN BOX
  32430.     "\u2424":"NL", // SYMBOL FOR NEWLINE
  32431.     "\u2425":"///", // SYMBOL FOR DELETE FORM TWO
  32432.     "\u2426":"?", // SYMBOL FOR SUBSTITUTE FORM TWO
  32433.     "\u2460":"(1)", // CIRCLED DIGIT ONE
  32434.     "\u2461":"(2)", // CIRCLED DIGIT TWO
  32435.     "\u2462":"(3)", // CIRCLED DIGIT THREE
  32436.     "\u2463":"(4)", // CIRCLED DIGIT FOUR
  32437.     "\u2464":"(5)", // CIRCLED DIGIT FIVE
  32438.     "\u2465":"(6)", // CIRCLED DIGIT SIX
  32439.     "\u2466":"(7)", // CIRCLED DIGIT SEVEN
  32440.     "\u2467":"(8)", // CIRCLED DIGIT EIGHT
  32441.     "\u2468":"(9)", // CIRCLED DIGIT NINE
  32442.     "\u2469":"(10)", // CIRCLED NUMBER TEN
  32443.     "\u246A":"(11)", // CIRCLED NUMBER ELEVEN
  32444.     "\u246B":"(12)", // CIRCLED NUMBER TWELVE
  32445.     "\u246C":"(13)", // CIRCLED NUMBER THIRTEEN
  32446.     "\u246D":"(14)", // CIRCLED NUMBER FOURTEEN
  32447.     "\u246E":"(15)", // CIRCLED NUMBER FIFTEEN
  32448.     "\u246F":"(16)", // CIRCLED NUMBER SIXTEEN
  32449.     "\u2470":"(17)", // CIRCLED NUMBER SEVENTEEN
  32450.     "\u2471":"(18)", // CIRCLED NUMBER EIGHTEEN
  32451.     "\u2472":"(19)", // CIRCLED NUMBER NINETEEN
  32452.     "\u2473":"(20)", // CIRCLED NUMBER TWENTY
  32453.     "\u2474":"(1)", // PARENTHESIZED DIGIT ONE
  32454.     "\u2475":"(2)", // PARENTHESIZED DIGIT TWO
  32455.     "\u2476":"(3)", // PARENTHESIZED DIGIT THREE
  32456.     "\u2477":"(4)", // PARENTHESIZED DIGIT FOUR
  32457.     "\u2478":"(5)", // PARENTHESIZED DIGIT FIVE
  32458.     "\u2479":"(6)", // PARENTHESIZED DIGIT SIX
  32459.     "\u247A":"(7)", // PARENTHESIZED DIGIT SEVEN
  32460.     "\u247B":"(8)", // PARENTHESIZED DIGIT EIGHT
  32461.     "\u247C":"(9)", // PARENTHESIZED DIGIT NINE
  32462.     "\u247D":"(10)", // PARENTHESIZED NUMBER TEN
  32463.     "\u247E":"(11)", // PARENTHESIZED NUMBER ELEVEN
  32464.     "\u247F":"(12)", // PARENTHESIZED NUMBER TWELVE
  32465.     "\u2480":"(13)", // PARENTHESIZED NUMBER THIRTEEN
  32466.     "\u2481":"(14)", // PARENTHESIZED NUMBER FOURTEEN
  32467.     "\u2482":"(15)", // PARENTHESIZED NUMBER FIFTEEN
  32468.     "\u2483":"(16)", // PARENTHESIZED NUMBER SIXTEEN
  32469.     "\u2484":"(17)", // PARENTHESIZED NUMBER SEVENTEEN
  32470.     "\u2485":"(18)", // PARENTHESIZED NUMBER EIGHTEEN
  32471.     "\u2486":"(19)", // PARENTHESIZED NUMBER NINETEEN
  32472.     "\u2487":"(20)", // PARENTHESIZED NUMBER TWENTY
  32473.     "\u2488":"1.", // DIGIT ONE FULL STOP
  32474.     "\u2489":"2.", // DIGIT TWO FULL STOP
  32475.     "\u248A":"3.", // DIGIT THREE FULL STOP
  32476.     "\u248B":"4.", // DIGIT FOUR FULL STOP
  32477.     "\u248C":"5.", // DIGIT FIVE FULL STOP
  32478.     "\u248D":"6.", // DIGIT SIX FULL STOP
  32479.     "\u248E":"7.", // DIGIT SEVEN FULL STOP
  32480.     "\u248F":"8.", // DIGIT EIGHT FULL STOP
  32481.     "\u2490":"9.", // DIGIT NINE FULL STOP
  32482.     "\u2491":"10.", // NUMBER TEN FULL STOP
  32483.     "\u2492":"11.", // NUMBER ELEVEN FULL STOP
  32484.     "\u2493":"12.", // NUMBER TWELVE FULL STOP
  32485.     "\u2494":"13.", // NUMBER THIRTEEN FULL STOP
  32486.     "\u2495":"14.", // NUMBER FOURTEEN FULL STOP
  32487.     "\u2496":"15.", // NUMBER FIFTEEN FULL STOP
  32488.     "\u2497":"16.", // NUMBER SIXTEEN FULL STOP
  32489.     "\u2498":"17.", // NUMBER SEVENTEEN FULL STOP
  32490.     "\u2499":"18.", // NUMBER EIGHTEEN FULL STOP
  32491.     "\u249A":"19.", // NUMBER NINETEEN FULL STOP
  32492.     "\u249B":"20.", // NUMBER TWENTY FULL STOP
  32493.     "\u249C":"(a)", // PARENTHESIZED LATIN SMALL LETTER A
  32494.     "\u249D":"(b)", // PARENTHESIZED LATIN SMALL LETTER B
  32495.     "\u249E":"(c)", // PARENTHESIZED LATIN SMALL LETTER C
  32496.     "\u249F":"(d)", // PARENTHESIZED LATIN SMALL LETTER D
  32497.     "\u24A0":"(e)", // PARENTHESIZED LATIN SMALL LETTER E
  32498.     "\u24A1":"(f)", // PARENTHESIZED LATIN SMALL LETTER F
  32499.     "\u24A2":"(g)", // PARENTHESIZED LATIN SMALL LETTER G
  32500.     "\u24A3":"(h)", // PARENTHESIZED LATIN SMALL LETTER H
  32501.     "\u24A4":"(i)", // PARENTHESIZED LATIN SMALL LETTER I
  32502.     "\u24A5":"(j)", // PARENTHESIZED LATIN SMALL LETTER J
  32503.     "\u24A6":"(k)", // PARENTHESIZED LATIN SMALL LETTER K
  32504.     "\u24A7":"(l)", // PARENTHESIZED LATIN SMALL LETTER L
  32505.     "\u24A8":"(m)", // PARENTHESIZED LATIN SMALL LETTER M
  32506.     "\u24A9":"(n)", // PARENTHESIZED LATIN SMALL LETTER N
  32507.     "\u24AA":"(o)", // PARENTHESIZED LATIN SMALL LETTER O
  32508.     "\u24AB":"(p)", // PARENTHESIZED LATIN SMALL LETTER P
  32509.     "\u24AC":"(q)", // PARENTHESIZED LATIN SMALL LETTER Q
  32510.     "\u24AD":"(r)", // PARENTHESIZED LATIN SMALL LETTER R
  32511.     "\u24AE":"(s)", // PARENTHESIZED LATIN SMALL LETTER S
  32512.     "\u24AF":"(t)", // PARENTHESIZED LATIN SMALL LETTER T
  32513.     "\u24B0":"(u)", // PARENTHESIZED LATIN SMALL LETTER U
  32514.     "\u24B1":"(v)", // PARENTHESIZED LATIN SMALL LETTER V
  32515.     "\u24B2":"(w)", // PARENTHESIZED LATIN SMALL LETTER W
  32516.     "\u24B3":"(x)", // PARENTHESIZED LATIN SMALL LETTER X
  32517.     "\u24B4":"(y)", // PARENTHESIZED LATIN SMALL LETTER Y
  32518.     "\u24B5":"(z)", // PARENTHESIZED LATIN SMALL LETTER Z
  32519.     "\u24B6":"(A)", // CIRCLED LATIN CAPITAL LETTER A
  32520.     "\u24B7":"(B)", // CIRCLED LATIN CAPITAL LETTER B
  32521.     "\u24B8":"(C)", // CIRCLED LATIN CAPITAL LETTER C
  32522.     "\u24B9":"(D)", // CIRCLED LATIN CAPITAL LETTER D
  32523.     "\u24BA":"(E)", // CIRCLED LATIN CAPITAL LETTER E
  32524.     "\u24BB":"(F)", // CIRCLED LATIN CAPITAL LETTER F
  32525.     "\u24BC":"(G)", // CIRCLED LATIN CAPITAL LETTER G
  32526.     "\u24BD":"(H)", // CIRCLED LATIN CAPITAL LETTER H
  32527.     "\u24BE":"(I)", // CIRCLED LATIN CAPITAL LETTER I
  32528.     "\u24BF":"(J)", // CIRCLED LATIN CAPITAL LETTER J
  32529.     "\u24C0":"(K)", // CIRCLED LATIN CAPITAL LETTER K
  32530.     "\u24C1":"(L)", // CIRCLED LATIN CAPITAL LETTER L
  32531.     "\u24C2":"(M)", // CIRCLED LATIN CAPITAL LETTER M
  32532.     "\u24C3":"(N)", // CIRCLED LATIN CAPITAL LETTER N
  32533.     "\u24C4":"(O)", // CIRCLED LATIN CAPITAL LETTER O
  32534.     "\u24C5":"(P)", // CIRCLED LATIN CAPITAL LETTER P
  32535.     "\u24C6":"(Q)", // CIRCLED LATIN CAPITAL LETTER Q
  32536.     "\u24C7":"(R)", // CIRCLED LATIN CAPITAL LETTER R
  32537.     "\u24C8":"(S)", // CIRCLED LATIN CAPITAL LETTER S
  32538.     "\u24C9":"(T)", // CIRCLED LATIN CAPITAL LETTER T
  32539.     "\u24CA":"(U)", // CIRCLED LATIN CAPITAL LETTER U
  32540.     "\u24CB":"(V)", // CIRCLED LATIN CAPITAL LETTER V
  32541.     "\u24CC":"(W)", // CIRCLED LATIN CAPITAL LETTER W
  32542.     "\u24CD":"(X)", // CIRCLED LATIN CAPITAL LETTER X
  32543.     "\u24CE":"(Y)", // CIRCLED LATIN CAPITAL LETTER Y
  32544.     "\u24CF":"(Z)", // CIRCLED LATIN CAPITAL LETTER Z
  32545.     "\u24D0":"(a)", // CIRCLED LATIN SMALL LETTER A
  32546.     "\u24D1":"(b)", // CIRCLED LATIN SMALL LETTER B
  32547.     "\u24D2":"(c)", // CIRCLED LATIN SMALL LETTER C
  32548.     "\u24D3":"(d)", // CIRCLED LATIN SMALL LETTER D
  32549.     "\u24D4":"(e)", // CIRCLED LATIN SMALL LETTER E
  32550.     "\u24D5":"(f)", // CIRCLED LATIN SMALL LETTER F
  32551.     "\u24D6":"(g)", // CIRCLED LATIN SMALL LETTER G
  32552.     "\u24D7":"(h)", // CIRCLED LATIN SMALL LETTER H
  32553.     "\u24D8":"(i)", // CIRCLED LATIN SMALL LETTER I
  32554.     "\u24D9":"(j)", // CIRCLED LATIN SMALL LETTER J
  32555.     "\u24DA":"(k)", // CIRCLED LATIN SMALL LETTER K
  32556.     "\u24DB":"(l)", // CIRCLED LATIN SMALL LETTER L
  32557.     "\u24DC":"(m)", // CIRCLED LATIN SMALL LETTER M
  32558.     "\u24DD":"(n)", // CIRCLED LATIN SMALL LETTER N
  32559.     "\u24DE":"(o)", // CIRCLED LATIN SMALL LETTER O
  32560.     "\u24DF":"(p)", // CIRCLED LATIN SMALL LETTER P
  32561.     "\u24E0":"(q)", // CIRCLED LATIN SMALL LETTER Q
  32562.     "\u24E1":"(r)", // CIRCLED LATIN SMALL LETTER R
  32563.     "\u24E2":"(s)", // CIRCLED LATIN SMALL LETTER S
  32564.     "\u24E3":"(t)", // CIRCLED LATIN SMALL LETTER T
  32565.     "\u24E4":"(u)", // CIRCLED LATIN SMALL LETTER U
  32566.     "\u24E5":"(v)", // CIRCLED LATIN SMALL LETTER V
  32567.     "\u24E6":"(w)", // CIRCLED LATIN SMALL LETTER W
  32568.     "\u24E7":"(x)", // CIRCLED LATIN SMALL LETTER X
  32569.     "\u24E8":"(y)", // CIRCLED LATIN SMALL LETTER Y
  32570.     "\u24E9":"(z)", // CIRCLED LATIN SMALL LETTER Z
  32571.     "\u24EA":"(0)", // CIRCLED DIGIT ZERO
  32572.     "\u2500":"-", // BOX DRAWINGS LIGHT HORIZONTAL
  32573.     "\u2501":"=", // BOX DRAWINGS HEAVY HORIZONTAL
  32574.     "\u2502":"|", // BOX DRAWINGS LIGHT VERTICAL
  32575.     "\u2503":"|", // BOX DRAWINGS HEAVY VERTICAL
  32576.     "\u2504":"-", // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
  32577.     "\u2505":"=", // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
  32578.     "\u2506":"|", // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
  32579.     "\u2507":"|", // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
  32580.     "\u2508":"-", // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
  32581.     "\u2509":"=", // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
  32582.     "\u250A":"|", // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
  32583.     "\u250B":"|", // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
  32584.     "\u250C":"+", // BOX DRAWINGS LIGHT DOWN AND RIGHT
  32585.     "\u250D":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
  32586.     "\u250E":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
  32587.     "\u250F":"+", // BOX DRAWINGS HEAVY DOWN AND RIGHT
  32588.     "\u2510":"+", // BOX DRAWINGS LIGHT DOWN AND LEFT
  32589.     "\u2511":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
  32590.     "\u2512":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
  32591.     "\u2513":"+", // BOX DRAWINGS HEAVY DOWN AND LEFT
  32592.     "\u2514":"+", // BOX DRAWINGS LIGHT UP AND RIGHT
  32593.     "\u2515":"+", // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
  32594.     "\u2516":"+", // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
  32595.     "\u2517":"+", // BOX DRAWINGS HEAVY UP AND RIGHT
  32596.     "\u2518":"+", // BOX DRAWINGS LIGHT UP AND LEFT
  32597.     "\u2519":"+", // BOX DRAWINGS UP LIGHT AND LEFT HEAVY
  32598.     "\u251A":"+", // BOX DRAWINGS UP HEAVY AND LEFT LIGHT
  32599.     "\u251B":"+", // BOX DRAWINGS HEAVY UP AND LEFT
  32600.     "\u251C":"+", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
  32601.     "\u251D":"+", // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
  32602.     "\u251E":"+", // BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
  32603.     "\u251F":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
  32604.     "\u2520":"+", // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
  32605.     "\u2521":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
  32606.     "\u2522":"+", // BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
  32607.     "\u2523":"+", // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
  32608.     "\u2524":"+", // BOX DRAWINGS LIGHT VERTICAL AND LEFT
  32609.     "\u2525":"+", // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
  32610.     "\u2526":"+", // BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
  32611.     "\u2527":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
  32612.     "\u2528":"+", // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
  32613.     "\u2529":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
  32614.     "\u252A":"+", // BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
  32615.     "\u252B":"+", // BOX DRAWINGS HEAVY VERTICAL AND LEFT
  32616.     "\u252C":"+", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
  32617.     "\u252D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
  32618.     "\u252E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
  32619.     "\u252F":"+", // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
  32620.     "\u2530":"+", // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
  32621.     "\u2531":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
  32622.     "\u2532":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
  32623.     "\u2533":"+", // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
  32624.     "\u2534":"+", // BOX DRAWINGS LIGHT UP AND HORIZONTAL
  32625.     "\u2535":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
  32626.     "\u2536":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
  32627.     "\u2537":"+", // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
  32628.     "\u2538":"+", // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
  32629.     "\u2539":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
  32630.     "\u253A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
  32631.     "\u253B":"+", // BOX DRAWINGS HEAVY UP AND HORIZONTAL
  32632.     "\u253C":"+", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
  32633.     "\u253D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
  32634.     "\u253E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
  32635.     "\u253F":"+", // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
  32636.     "\u2540":"+", // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
  32637.     "\u2541":"+", // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
  32638.     "\u2542":"+", // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
  32639.     "\u2543":"+", // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
  32640.     "\u2544":"+", // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
  32641.     "\u2545":"+", // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
  32642.     "\u2546":"+", // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
  32643.     "\u2547":"+", // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
  32644.     "\u2548":"+", // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
  32645.     "\u2549":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
  32646.     "\u254A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
  32647.     "\u254B":"+", // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
  32648.     "\u254C":"-", // BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
  32649.     "\u254D":"=", // BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
  32650.     "\u254E":"|", // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
  32651.     "\u254F":"|", // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
  32652.     "\u2550":"=", // BOX DRAWINGS DOUBLE HORIZONTAL
  32653.     "\u2551":"|", // BOX DRAWINGS DOUBLE VERTICAL
  32654.     "\u2552":"+", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
  32655.     "\u2553":"+", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
  32656.     "\u2554":"+", // BOX DRAWINGS DOUBLE DOWN AND RIGHT
  32657.     "\u2555":"+", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
  32658.     "\u2556":"+", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
  32659.     "\u2557":"+", // BOX DRAWINGS DOUBLE DOWN AND LEFT
  32660.     "\u2558":"+", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
  32661.     "\u2559":"+", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
  32662.     "\u255A":"+", // BOX DRAWINGS DOUBLE UP AND RIGHT
  32663.     "\u255B":"+", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
  32664.     "\u255C":"+", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
  32665.     "\u255D":"+", // BOX DRAWINGS DOUBLE UP AND LEFT
  32666.     "\u255E":"+", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
  32667.     "\u255F":"+", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
  32668.     "\u2560":"+", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
  32669.     "\u2561":"+", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
  32670.     "\u2562":"+", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
  32671.     "\u2563":"+", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
  32672.     "\u2564":"+", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
  32673.     "\u2565":"+", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
  32674.     "\u2566":"+", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
  32675.     "\u2567":"+", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
  32676.     "\u2568":"+", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
  32677.     "\u2569":"+", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
  32678.     "\u256A":"+", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
  32679.     "\u256B":"+", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
  32680.     "\u256C":"+", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
  32681.     "\u256D":"+", // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
  32682.     "\u256E":"+", // BOX DRAWINGS LIGHT ARC DOWN AND LEFT
  32683.     "\u256F":"+", // BOX DRAWINGS LIGHT ARC UP AND LEFT
  32684.     "\u2570":"+", // BOX DRAWINGS LIGHT ARC UP AND RIGHT
  32685.     "\u2571":"/", // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
  32686.     "\u2572":"\\", // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
  32687.     "\u2573":"X", // BOX DRAWINGS LIGHT DIAGONAL CROSS
  32688.     "\u257C":"-", // BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
  32689.     "\u257D":"|", // BOX DRAWINGS LIGHT UP AND HEAVY DOWN
  32690.     "\u257E":"-", // BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
  32691.     "\u257F":"|", // BOX DRAWINGS HEAVY UP AND LIGHT DOWN
  32692.     "\u25CB":"o", // WHITE CIRCLE
  32693.     "\u25E6":"{\\textopenbullet}", // WHITE BULLET
  32694.     "\u2605":"*", // BLACK STAR
  32695.     "\u2606":"*", // WHITE STAR
  32696.     "\u2612":"X", // BALLOT BOX WITH X
  32697.     "\u2613":"X", // SALTIRE
  32698.     "\u2639":":-(", // WHITE FROWNING FACE
  32699.     "\u263A":":-)", // WHITE SMILING FACE
  32700.     "\u263B":"(-:", // BLACK SMILING FACE
  32701.     "\u266D":"b", // MUSIC FLAT SIGN
  32702.     "\u266F":"$\\#$", // MUSIC SHARP SIGN
  32703.     "\u2701":"$\\%<$", // UPPER BLADE SCISSORS
  32704.     "\u2702":"$\\%<$", // BLACK SCISSORS
  32705.     "\u2703":"$\\%<$", // LOWER BLADE SCISSORS
  32706.     "\u2704":"$\\%<$", // WHITE SCISSORS
  32707.     "\u270C":"V", // VICTORY HAND
  32708.     "\u2713":"v", // CHECK MARK
  32709.     "\u2714":"V", // HEAVY CHECK MARK
  32710.     "\u2715":"x", // MULTIPLICATION X
  32711.     "\u2716":"x", // HEAVY MULTIPLICATION X
  32712.     "\u2717":"X", // BALLOT X
  32713.     "\u2718":"X", // HEAVY BALLOT X
  32714.     "\u2719":"+", // OUTLINED GREEK CROSS
  32715.     "\u271A":"+", // HEAVY GREEK CROSS
  32716.     "\u271B":"+", // OPEN CENTRE CROSS
  32717.     "\u271C":"+", // HEAVY OPEN CENTRE CROSS
  32718.     "\u271D":"+", // LATIN CROSS
  32719.     "\u271E":"+", // SHADOWED WHITE LATIN CROSS
  32720.     "\u271F":"+", // OUTLINED LATIN CROSS
  32721.     "\u2720":"+", // MALTESE CROSS
  32722.     "\u2721":"*", // STAR OF DAVID
  32723.     "\u2722":"+", // FOUR TEARDROP-SPOKED ASTERISK
  32724.     "\u2723":"+", // FOUR BALLOON-SPOKED ASTERISK
  32725.     "\u2724":"+", // HEAVY FOUR BALLOON-SPOKED ASTERISK
  32726.     "\u2725":"+", // FOUR CLUB-SPOKED ASTERISK
  32727.     "\u2726":"+", // BLACK FOUR POINTED STAR
  32728.     "\u2727":"+", // WHITE FOUR POINTED STAR
  32729.     "\u2729":"*", // STRESS OUTLINED WHITE STAR
  32730.     "\u272A":"*", // CIRCLED WHITE STAR
  32731.     "\u272B":"*", // OPEN CENTRE BLACK STAR
  32732.     "\u272C":"*", // BLACK CENTRE WHITE STAR
  32733.     "\u272D":"*", // OUTLINED BLACK STAR
  32734.     "\u272E":"*", // HEAVY OUTLINED BLACK STAR
  32735.     "\u272F":"*", // PINWHEEL STAR
  32736.     "\u2730":"*", // SHADOWED WHITE STAR
  32737.     "\u2731":"*", // HEAVY ASTERISK
  32738.     "\u2732":"*", // OPEN CENTRE ASTERISK
  32739.     "\u2733":"*", // EIGHT SPOKED ASTERISK
  32740.     "\u2734":"*", // EIGHT POINTED BLACK STAR
  32741.     "\u2735":"*", // EIGHT POINTED PINWHEEL STAR
  32742.     "\u2736":"*", // SIX POINTED BLACK STAR
  32743.     "\u2737":"*", // EIGHT POINTED RECTILINEAR BLACK STAR
  32744.     "\u2738":"*", // HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
  32745.     "\u2739":"*", // TWELVE POINTED BLACK STAR
  32746.     "\u273A":"*", // SIXTEEN POINTED ASTERISK
  32747.     "\u273B":"*", // TEARDROP-SPOKED ASTERISK
  32748.     "\u273C":"*", // OPEN CENTRE TEARDROP-SPOKED ASTERISK
  32749.     "\u273D":"*", // HEAVY TEARDROP-SPOKED ASTERISK
  32750.     "\u273E":"*", // SIX PETALLED BLACK AND WHITE FLORETTE
  32751.     "\u273F":"*", // BLACK FLORETTE
  32752.     "\u2740":"*", // WHITE FLORETTE
  32753.     "\u2741":"*", // EIGHT PETALLED OUTLINED BLACK FLORETTE
  32754.     "\u2742":"*", // CIRCLED OPEN CENTRE EIGHT POINTED STAR
  32755.     "\u2743":"*", // HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
  32756.     "\u2744":"*", // SNOWFLAKE
  32757.     "\u2745":"*", // TIGHT TRIFOLIATE SNOWFLAKE
  32758.     "\u2746":"*", // HEAVY CHEVRON SNOWFLAKE
  32759.     "\u2747":"*", // SPARKLE
  32760.     "\u2748":"*", // HEAVY SPARKLE
  32761.     "\u2749":"*", // BALLOON-SPOKED ASTERISK
  32762.     "\u274A":"*", // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
  32763.     "\u274B":"*", // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
  32764.     "\uFB00":"ff", // LATIN SMALL LIGATURE FF
  32765.     "\uFB01":"fi", // LATIN SMALL LIGATURE FI
  32766.     "\uFB02":"fl", // LATIN SMALL LIGATURE FL
  32767.     "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI
  32768.     "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL
  32769.     "\uFB05":"st", // LATIN SMALL LIGATURE LONG S T
  32770.     "\uFB06":"st", // LATIN SMALL LIGATURE ST
  32771. /* Derived accented characters */
  32772.     "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE
  32773.     "\u00C1":"\\''{A}", // LATIN CAPITAL LETTER A WITH ACUTE
  32774.     "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  32775.     "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE
  32776.     "\u00C4":"\\\"{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS
  32777.     "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA
  32778.     "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE
  32779.     "\u00C9":"\\''{E}", // LATIN CAPITAL LETTER E WITH ACUTE
  32780.     "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  32781.     "\u00CB":"\\\"{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS
  32782.     "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE
  32783.     "\u00CD":"\\''{I}", // LATIN CAPITAL LETTER I WITH ACUTE
  32784.     "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  32785.     "\u00CF":"\\\"{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS
  32786.     "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE
  32787.     "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE
  32788.     "\u00D3":"\\''{O}", // LATIN CAPITAL LETTER O WITH ACUTE
  32789.     "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  32790.     "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE
  32791.     "\u00D6":"\\\"{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS
  32792.     "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE
  32793.     "\u00DA":"\\''{U}", // LATIN CAPITAL LETTER U WITH ACUTE
  32794.     "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  32795.     "\u00DC":"\\\"{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS
  32796.     "\u00DD":"\\''{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE
  32797.     "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE
  32798.     "\u00E1":"\\''{a}", // LATIN SMALL LETTER A WITH ACUTE
  32799.     "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX
  32800.     "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE
  32801.     "\u00E4":"\\\"{a}", // LATIN SMALL LETTER A WITH DIAERESIS
  32802.     "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA
  32803.     "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE
  32804.     "\u00E9":"\\''{e}", // LATIN SMALL LETTER E WITH ACUTE
  32805.     "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX
  32806.     "\u00EB":"\\\"{e}", // LATIN SMALL LETTER E WITH DIAERESIS
  32807.     "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE
  32808.     "\u00ED":"\\''{i}", // LATIN SMALL LETTER I WITH ACUTE
  32809.     "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX
  32810.     "\u00EF":"\\\"{i}", // LATIN SMALL LETTER I WITH DIAERESIS
  32811.     "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE
  32812.     "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE
  32813.     "\u00F3":"\\''{o}", // LATIN SMALL LETTER O WITH ACUTE
  32814.     "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX
  32815.     "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE
  32816.     "\u00F6":"\\\"{o}", // LATIN SMALL LETTER O WITH DIAERESIS
  32817.     "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE
  32818.     "\u00FA":"\\''{u}", // LATIN SMALL LETTER U WITH ACUTE
  32819.     "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX
  32820.     "\u00FC":"\\\"{u}", // LATIN SMALL LETTER U WITH DIAERESIS
  32821.     "\u00FD":"\\''{y}", // LATIN SMALL LETTER Y WITH ACUTE
  32822.     "\u00FF":"\\\"{y}", // LATIN SMALL LETTER Y WITH DIAERESIS
  32823.     "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON
  32824.     "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON
  32825.     "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE
  32826.     "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE
  32827.     "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK
  32828.     "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK
  32829.     "\u0106":"\\''{C}", // LATIN CAPITAL LETTER C WITH ACUTE
  32830.     "\u0107":"\\''{c}", // LATIN SMALL LETTER C WITH ACUTE
  32831.     "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
  32832.     "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX
  32833.     "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE
  32834.     "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE
  32835.     "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON
  32836.     "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON
  32837.     "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON
  32838.     "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON
  32839.     "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON
  32840.     "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON
  32841.     "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE
  32842.     "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE
  32843.     "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE
  32844.     "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE
  32845.     "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK
  32846.     "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK
  32847.     "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON
  32848.     "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON
  32849.     "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
  32850.     "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX
  32851.     "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE
  32852.     "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE
  32853.     "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE
  32854.     "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE
  32855.     "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA
  32856.     "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA
  32857.     "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
  32858.     "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX
  32859.     "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE
  32860.     "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE
  32861.     "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON
  32862.     "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON
  32863.     "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE
  32864.     "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE
  32865.     "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK
  32866.     "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK
  32867.     "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE
  32868.     "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
  32869.     "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX
  32870.     "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA
  32871.     "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA
  32872.     "\u0139":"\\''{L}", // LATIN CAPITAL LETTER L WITH ACUTE
  32873.     "\u013A":"\\''{l}", // LATIN SMALL LETTER L WITH ACUTE
  32874.     "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA
  32875.     "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
  32876.     "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
  32877.     "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON
  32878.     "\u0143":"\\''{N}", // LATIN CAPITAL LETTER N WITH ACUTE
  32879.     "\u0144":"\\''{n}", // LATIN SMALL LETTER N WITH ACUTE
  32880.     "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
  32881.     "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA
  32882.     "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON
  32883.     "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON
  32884.     "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON
  32885.     "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON
  32886.     "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE
  32887.     "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE
  32888.     "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
  32889.     "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
  32890.     "\u0154":"\\''{R}", // LATIN CAPITAL LETTER R WITH ACUTE
  32891.     "\u0155":"\\''{r}", // LATIN SMALL LETTER R WITH ACUTE
  32892.     "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA
  32893.     "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA
  32894.     "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON
  32895.     "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON
  32896.     "\u015A":"\\''{S}", // LATIN CAPITAL LETTER S WITH ACUTE
  32897.     "\u015B":"\\''{s}", // LATIN SMALL LETTER S WITH ACUTE
  32898.     "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
  32899.     "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX
  32900.     "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA
  32901.     "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA
  32902.     "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON
  32903.     "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON
  32904.     "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA
  32905.     "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA
  32906.     "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON
  32907.     "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON
  32908.     "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE
  32909.     "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE
  32910.     "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON
  32911.     "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON
  32912.     "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE
  32913.     "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE
  32914.     "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
  32915.     "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
  32916.     "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK
  32917.     "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK
  32918.     "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
  32919.     "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX
  32920.     "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
  32921.     "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
  32922.     "\u0178":"\\\"{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS
  32923.     "\u0179":"\\''{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE
  32924.     "\u017A":"\\''{z}", // LATIN SMALL LETTER Z WITH ACUTE
  32925.     "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
  32926.     "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE
  32927.     "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON
  32928.     "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON
  32929.     "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON
  32930.     "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON
  32931.     "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON
  32932.     "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON
  32933.     "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON
  32934.     "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON
  32935.     "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON
  32936.     "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON
  32937.     "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON
  32938.     "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON
  32939.     "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON
  32940.     "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON
  32941.     "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK
  32942.     "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK
  32943.     "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON
  32944.     "\u01F4":"\\''{G}", // LATIN CAPITAL LETTER G WITH ACUTE
  32945.     "\u01F5":"\\''{g}", // LATIN SMALL LETTER G WITH ACUTE
  32946.     "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE
  32947.     "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE
  32948.     "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW
  32949.     "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW
  32950.     "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW
  32951.     "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW
  32952.     "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE
  32953.     "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE
  32954.     "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW
  32955.     "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW
  32956.     "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW
  32957.     "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW
  32958.     "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA
  32959.     "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA
  32960.     "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE
  32961.     "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE
  32962.     "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON
  32963.     "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON
  32964.     "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE
  32965.     "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE
  32966.     "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW
  32967.     "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW
  32968.     "\u1E26":"\\\"{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS
  32969.     "\u1E27":"\\\"{h}", // LATIN SMALL LETTER H WITH DIAERESIS
  32970.     "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA
  32971.     "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA
  32972.     "\u1E30":"\\''{K}", // LATIN CAPITAL LETTER K WITH ACUTE
  32973.     "\u1E31":"\\''{k}", // LATIN SMALL LETTER K WITH ACUTE
  32974.     "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW
  32975.     "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW
  32976.     "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW
  32977.     "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW
  32978.     "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW
  32979.     "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW
  32980.     "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW
  32981.     "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW
  32982.     "\u1E3E":"\\''{M}", // LATIN CAPITAL LETTER M WITH ACUTE
  32983.     "\u1E3F":"\\''{m}", // LATIN SMALL LETTER M WITH ACUTE
  32984.     "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE
  32985.     "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE
  32986.     "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW
  32987.     "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW
  32988.     "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE
  32989.     "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE
  32990.     "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW
  32991.     "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW
  32992.     "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW
  32993.     "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW
  32994.     "\u1E54":"\\''{P}", // LATIN CAPITAL LETTER P WITH ACUTE
  32995.     "\u1E55":"\\''{p}", // LATIN SMALL LETTER P WITH ACUTE
  32996.     "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE
  32997.     "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE
  32998.     "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE
  32999.     "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE
  33000.     "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW
  33001.     "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW
  33002.     "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW
  33003.     "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW
  33004.     "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE
  33005.     "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE
  33006.     "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW
  33007.     "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW
  33008.     "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE
  33009.     "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE
  33010.     "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW
  33011.     "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW
  33012.     "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW
  33013.     "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW
  33014.     "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE
  33015.     "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE
  33016.     "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW
  33017.     "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW
  33018.     "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE
  33019.     "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE
  33020.     "\u1E82":"\\''{W}", // LATIN CAPITAL LETTER W WITH ACUTE
  33021.     "\u1E83":"\\''{w}", // LATIN SMALL LETTER W WITH ACUTE
  33022.     "\u1E84":"\\\"{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS
  33023.     "\u1E85":"\\\"{w}", // LATIN SMALL LETTER W WITH DIAERESIS
  33024.     "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE
  33025.     "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE
  33026.     "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW
  33027.     "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW
  33028.     "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE
  33029.     "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE
  33030.     "\u1E8C":"\\\"{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS
  33031.     "\u1E8D":"\\\"{x}", // LATIN SMALL LETTER X WITH DIAERESIS
  33032.     "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
  33033.     "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE
  33034.     "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
  33035.     "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
  33036.     "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW
  33037.     "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW
  33038.     "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW
  33039.     "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW
  33040.     "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW
  33041.     "\u1E97":"\\\"{t}", // LATIN SMALL LETTER T WITH DIAERESIS
  33042.     "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW
  33043.     "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW
  33044.     "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW
  33045.     "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW
  33046.     "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE
  33047.     "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE
  33048.     "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW
  33049.     "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW
  33050.     "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW
  33051.     "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW
  33052.     "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW
  33053.     "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW
  33054.     "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE
  33055.     "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE
  33056.     "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
  33057.     "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
  33058.     "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
  33059.     "\u1EF9":"\\~{y}", // LATIN SMALL LETTER Y WITH TILDE
  33060.  
  33061. };
  33062.  
  33063. /* unfortunately the mapping isn''t reversible - hence this second table - sigh! */
  33064. var reversemappingTable = {
  33065.     "\\url"                           : "",       // strip ''url''
  33066.     "\\href"                          : "",       // strip ''href''
  33067.     "~"                               : "\u00A0", // NO-BREAK SPACE
  33068.     "{\\textexclamdown}"              : "\u00A1", // INVERTED EXCLAMATION MARK
  33069.     "{\\textcent}"                    : "\u00A2", // CENT SIGN
  33070.     "{\\textsterling}"                : "\u00A3", // POUND SIGN
  33071.     "{\\textyen}"                     : "\u00A5", // YEN SIGN
  33072.     "{\\textbrokenbar}"               : "\u00A6", // BROKEN BAR
  33073.     "{\\textsection}"                 : "\u00A7", // SECTION SIGN
  33074.     "{\\textasciidieresis}"           : "\u00A8", // DIAERESIS
  33075.     "{\\textcopyright}"               : "\u00A9", // COPYRIGHT SIGN
  33076.     "{\\textordfeminine}"             : "\u00AA", // FEMININE ORDINAL INDICATOR
  33077.     "{\\guillemotleft}"               : "\u00AB", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  33078.     "{\\textlnot}"                    : "\u00AC", // NOT SIGN
  33079.     "{\\textregistered}"              : "\u00AE", // REGISTERED SIGN
  33080.     "{\\textasciimacron}"             : "\u00AF", // MACRON
  33081.     "{\\textdegree}"                  : "\u00B0", // DEGREE SIGN
  33082.     "{\\textpm}"                      : "\u00B1", // PLUS-MINUS SIGN
  33083.     "{\\texttwosuperior}"             : "\u00B2", // SUPERSCRIPT TWO
  33084.     "{\\textthreesuperior}"           : "\u00B3", // SUPERSCRIPT THREE
  33085.     "{\\textasciiacute}"              : "\u00B4", // ACUTE ACCENT
  33086.     "{\\textmu}"                      : "\u00B5", // MICRO SIGN
  33087.     "{\\textparagraph}"               : "\u00B6", // PILCROW SIGN
  33088.     "{\\textperiodcentered}"          : "\u00B7", // MIDDLE DOT
  33089.     "{\\c\\ }"                        : "\u00B8", // CEDILLA
  33090.     "{\\textonesuperior}"             : "\u00B9", // SUPERSCRIPT ONE
  33091.     "{\\textordmasculine}"            : "\u00BA", // MASCULINE ORDINAL INDICATOR
  33092.     "{\\guillemotright}"              : "\u00BB", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  33093.     "{\\textonequarter}"              : "\u00BC", // VULGAR FRACTION ONE QUARTER
  33094.     "{\\textonehalf}"                 : "\u00BD", // VULGAR FRACTION ONE HALF
  33095.     "{\\textthreequarters}"           : "\u00BE", // VULGAR FRACTION THREE QUARTERS
  33096.     "{\\textquestiondown}"            : "\u00BF", // INVERTED QUESTION MARK
  33097.     "{\\AE}"                          : "\u00C6", // LATIN CAPITAL LETTER AE
  33098.     "{\\DH}"                          : "\u00D0", // LATIN CAPITAL LETTER ETH
  33099.     "{\\texttimes}"                   : "\u00D7", // MULTIPLICATION SIGN
  33100.     "{\\TH}"                          : "\u00DE", // LATIN CAPITAL LETTER THORN
  33101.     "{\\ss}"                          : "\u00DF", // LATIN SMALL LETTER SHARP S
  33102.     "{\\ae}"                          : "\u00E6", // LATIN SMALL LETTER AE
  33103.     "{\\dh}"                          : "\u00F0", // LATIN SMALL LETTER ETH
  33104.     "{\\textdiv}"                     : "\u00F7", // DIVISION SIGN
  33105.     "{\\th}"                          : "\u00FE", // LATIN SMALL LETTER THORN
  33106.     "{\\i}"                           : "\u0131", // LATIN SMALL LETTER DOTLESS I
  33107.     "''n"                              : "\u0149", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  33108.     "{\\NG}"                          : "\u014A", // LATIN CAPITAL LETTER ENG
  33109.     "{\\ng}"                          : "\u014B", // LATIN SMALL LETTER ENG
  33110.     "{\\OE}"                          : "\u0152", // LATIN CAPITAL LIGATURE OE
  33111.     "{\\oe}"                          : "\u0153", // LATIN SMALL LIGATURE OE
  33112.     "{\\textasciicircum}"             : "\u02C6", // MODIFIER LETTER CIRCUMFLEX ACCENT
  33113.     "\\~{}"                           : "\u02DC", // SMALL TILDE
  33114.     "{\\textacutedbl}"                : "\u02DD", // DOUBLE ACUTE ACCENT
  33115.     "{\\textendash}"                  : "\u2013", // EN DASH
  33116.     "{\\textemdash}"                  : "\u2014", // EM DASH
  33117.     "---"                             : "\u2014", // EM DASH
  33118.     "--"                              : "\u2013", // EN DASH
  33119.     "{\\textbardbl}"                  : "\u2016", // DOUBLE VERTICAL LINE
  33120.     "{\\textunderscore}"              : "\u2017", // DOUBLE LOW LINE
  33121.     "{\\textquoteleft}"               : "\u2018", // LEFT SINGLE QUOTATION MARK
  33122.     "{\\textquoteright}"              : "\u2019", // RIGHT SINGLE QUOTATION MARK
  33123.     "{\\quotesinglbase}"              : "\u201A", // SINGLE LOW-9 QUOTATION MARK
  33124.     "{\\textquotedblleft}"            : "\u201C", // LEFT DOUBLE QUOTATION MARK
  33125.     "{\\textquotedblright}"           : "\u201D", // RIGHT DOUBLE QUOTATION MARK
  33126.     "{\\quotedblbase}"                : "\u201E", // DOUBLE LOW-9 QUOTATION MARK
  33127.     "{\\quotedblbase}"                : "\u201F", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  33128.     "{\\textdagger}"                  : "\u2020", // DAGGER
  33129.     "{\\textdaggerdbl}"               : "\u2021", // DOUBLE DAGGER
  33130.     "{\\textbullet}"                  : "\u2022", // BULLET
  33131.     "{\\textellipsis}"                : "\u2026", // HORIZONTAL ELLIPSIS
  33132.     "{\\textperthousand}"             : "\u2030", // PER MILLE SIGN
  33133.     "''''''"                             : "\u2034", // TRIPLE PRIME
  33134.     "''''"                              : "\u201D", // RIGHT DOUBLE QUOTATION MARK (could be a double prime)
  33135.     "``"                              : "\u201C", // LEFT DOUBLE QUOTATION MARK (could be a reversed double prime)
  33136.     "```"                             : "\u2037", // REVERSED TRIPLE PRIME
  33137.     "{\\guilsinglleft}"               : "\u2039", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
  33138.     "{\\guilsinglright}"              : "\u203A", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
  33139.     "!!"                              : "\u203C", // DOUBLE EXCLAMATION MARK
  33140.     "{\\textfractionsolidus}"         : "\u2044", // FRACTION SLASH
  33141.     "?!"                              : "\u2048", // QUESTION EXCLAMATION MARK
  33142.     "!?"                              : "\u2049", // EXCLAMATION QUESTION MARK
  33143.     "$^{0}$"                          : "\u2070", // SUPERSCRIPT ZERO
  33144.     "$^{4}$"                          : "\u2074", // SUPERSCRIPT FOUR
  33145.     "$^{5}$"                          : "\u2075", // SUPERSCRIPT FIVE
  33146.     "$^{6}$"                          : "\u2076", // SUPERSCRIPT SIX
  33147.     "$^{7}$"                          : "\u2077", // SUPERSCRIPT SEVEN
  33148.     "$^{8}$"                          : "\u2078", // SUPERSCRIPT EIGHT
  33149.     "$^{9}$"                          : "\u2079", // SUPERSCRIPT NINE
  33150.     "$^{+}$"                          : "\u207A", // SUPERSCRIPT PLUS SIGN
  33151.     "$^{-}$"                          : "\u207B", // SUPERSCRIPT MINUS
  33152.     "$^{=}$"                          : "\u207C", // SUPERSCRIPT EQUALS SIGN
  33153.     "$^{(}$"                          : "\u207D", // SUPERSCRIPT LEFT PARENTHESIS
  33154.     "$^{)}$"                          : "\u207E", // SUPERSCRIPT RIGHT PARENTHESIS
  33155.     "$^{n}$"                          : "\u207F", // SUPERSCRIPT LATIN SMALL LETTER N
  33156.     "$_{0}$"                          : "\u2080", // SUBSCRIPT ZERO
  33157.     "$_{1}$"                          : "\u2081", // SUBSCRIPT ONE
  33158.     "$_{2}$"                          : "\u2082", // SUBSCRIPT TWO
  33159.     "$_{3}$"                          : "\u2083", // SUBSCRIPT THREE
  33160.     "$_{4}$"                          : "\u2084", // SUBSCRIPT FOUR
  33161.     "$_{5}$"                          : "\u2085", // SUBSCRIPT FIVE
  33162.     "$_{6}$"                          : "\u2086", // SUBSCRIPT SIX
  33163.     "$_{7}$"                          : "\u2087", // SUBSCRIPT SEVEN
  33164.     "$_{8}$"                          : "\u2088", // SUBSCRIPT EIGHT
  33165.     "$_{9}$"                          : "\u2089", // SUBSCRIPT NINE
  33166.     "$_{+}$"                          : "\u208A", // SUBSCRIPT PLUS SIGN
  33167.     "$_{-}$"                          : "\u208B", // SUBSCRIPT MINUS
  33168.     "$_{=}$"                          : "\u208C", // SUBSCRIPT EQUALS SIGN
  33169.     "$_{(}$"                          : "\u208D", // SUBSCRIPT LEFT PARENTHESIS
  33170.     "$_{)}$"                          : "\u208E", // SUBSCRIPT RIGHT PARENTHESIS
  33171.     "{\\texteuro}"                    : "\u20AC", // EURO SIGN
  33172.     "a/c"                             : "\u2100", // ACCOUNT OF
  33173.     "a/s"                             : "\u2101", // ADDRESSED TO THE SUBJECT
  33174.     "{\\textcelsius}"                 : "\u2103", // DEGREE CELSIUS
  33175.     "c/o"                             : "\u2105", // CARE OF
  33176.     "c/u"                             : "\u2106", // CADA UNA
  33177.     "{\\textnumero}"                  : "\u2116", // NUMERO SIGN
  33178.     "{\\textcircledP}"                : "\u2117", // SOUND RECORDING COPYRIGHT
  33179.     "{\\textservicemark}"             : "\u2120", // SERVICE MARK
  33180.     "{TEL}"                           : "\u2121", // TELEPHONE SIGN
  33181.     "{\\texttrademark}"               : "\u2122", // TRADE MARK SIGN
  33182.     "{\\textohm}"                     : "\u2126", // OHM SIGN
  33183.     "{\\textestimated}"               : "\u212E", // ESTIMATED SYMBOL
  33184.     " 1/3"                            : "\u2153", // VULGAR FRACTION ONE THIRD
  33185.     " 2/3"                            : "\u2154", // VULGAR FRACTION TWO THIRDS
  33186.     " 1/5"                            : "\u2155", // VULGAR FRACTION ONE FIFTH
  33187.     " 2/5"                            : "\u2156", // VULGAR FRACTION TWO FIFTHS
  33188.     " 3/5"                            : "\u2157", // VULGAR FRACTION THREE FIFTHS
  33189.     " 4/5"                            : "\u2158", // VULGAR FRACTION FOUR FIFTHS
  33190.     " 1/6"                            : "\u2159", // VULGAR FRACTION ONE SIXTH
  33191.     " 5/6"                            : "\u215A", // VULGAR FRACTION FIVE SIXTHS
  33192.     " 1/8"                            : "\u215B", // VULGAR FRACTION ONE EIGHTH
  33193.     " 3/8"                            : "\u215C", // VULGAR FRACTION THREE EIGHTHS
  33194.     " 5/8"                            : "\u215D", // VULGAR FRACTION FIVE EIGHTHS
  33195.     " 7/8"                            : "\u215E", // VULGAR FRACTION SEVEN EIGHTHS
  33196.     " 1/"                             : "\u215F", // FRACTION NUMERATOR ONE
  33197.     "{\\textleftarrow}"               : "\u2190", // LEFTWARDS ARROW
  33198.     "{\\textuparrow}"                 : "\u2191", // UPWARDS ARROW
  33199.     "{\\textrightarrow}"              : "\u2192", // RIGHTWARDS ARROW
  33200.     "{\\textdownarrow}"               : "\u2193", // DOWNWARDS ARROW
  33201.     "<->"                             : "\u2194", // LEFT RIGHT ARROW
  33202.     "<="                              : "\u21D0", // LEFTWARDS DOUBLE ARROW
  33203.     "=>"                              : "\u21D2", // RIGHTWARDS DOUBLE ARROW
  33204.     "<=>"                             : "\u21D4", // LEFT RIGHT DOUBLE ARROW
  33205.     "$\\infty$"                       : "\u221E", // INFINITY
  33206.     "||"                              : "\u2225", // PARALLEL TO
  33207.     "\\~{}"                           : "\u223C", // TILDE OPERATOR
  33208.     "/="                              : "\u2260", // NOT EQUAL TO
  33209.     "<="                              : "\u2264", // LESS-THAN OR EQUAL TO
  33210.     ">="                              : "\u2265", // GREATER-THAN OR EQUAL TO
  33211.     "<<"                              : "\u226A", // MUCH LESS-THAN
  33212.     ">>"                              : "\u226B", // MUCH GREATER-THAN
  33213.     "(+)"                             : "\u2295", // CIRCLED PLUS
  33214.     "(-)"                             : "\u2296", // CIRCLED MINUS
  33215.     "(x)"                             : "\u2297", // CIRCLED TIMES
  33216.     "(/)"                             : "\u2298", // CIRCLED DIVISION SLASH
  33217.     "|-"                              : "\u22A2", // RIGHT TACK
  33218.     "-|"                              : "\u22A3", // LEFT TACK
  33219.     "|-"                              : "\u22A6", // ASSERTION
  33220.     "|="                              : "\u22A7", // MODELS
  33221.     "|="                              : "\u22A8", // TRUE
  33222.     "||-"                             : "\u22A9", // FORCES
  33223.     "$\\#$"                           : "\u22D5", // EQUAL AND PARALLEL TO
  33224.     "<<<"                             : "\u22D8", // VERY MUCH LESS-THAN
  33225.     ">>>"                             : "\u22D9", // VERY MUCH GREATER-THAN
  33226.     "{\\textlangle}"                  : "\u2329", // LEFT-POINTING ANGLE BRACKET
  33227.     "{\\textrangle}"                  : "\u232A", // RIGHT-POINTING ANGLE BRACKET
  33228.     "{\\textvisiblespace}"            : "\u2423", // OPEN BOX
  33229.     "///"                             : "\u2425", // SYMBOL FOR DELETE FORM TWO
  33230.     "{\\textopenbullet}"              : "\u25E6", // WHITE BULLET
  33231.     ":-("                             : "\u2639", // WHITE FROWNING FACE
  33232.     ":-)"                             : "\u263A", // WHITE SMILING FACE
  33233.     "(-: "                            : "\u263B", // BLACK SMILING FACE
  33234.     "$\\#$"                           : "\u266F", // MUSIC SHARP SIGN
  33235.     "$\\%<$"                          : "\u2701", // UPPER BLADE SCISSORS
  33236.     "$\\%<$"                          : "\u2702", // BLACK SCISSORS
  33237.     "$\\%<$"                          : "\u2703", // LOWER BLADE SCISSORS
  33238.     "$\\%<$"                          : "\u2704", // WHITE SCISSORS
  33239. /* Derived accented characters */
  33240.     "\\`{A}"                          : "\u00C0", // LATIN CAPITAL LETTER A WITH GRAVE
  33241.     "\\''{A}"                          : "\u00C1", // LATIN CAPITAL LETTER A WITH ACUTE
  33242.     "\\^{A}"                          : "\u00C2", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  33243.     "\\~{A}"                          : "\u00C3", // LATIN CAPITAL LETTER A WITH TILDE
  33244.     "\\\"{A}"                         : "\u00C4", // LATIN CAPITAL LETTER A WITH DIAERESIS
  33245.     "\\c{C}"                          : "\u00C7", // LATIN CAPITAL LETTER C WITH CEDILLA
  33246.     "\\`{E}"                          : "\u00C8", // LATIN CAPITAL LETTER E WITH GRAVE
  33247.     "\\''{E}"                          : "\u00C9", // LATIN CAPITAL LETTER E WITH ACUTE
  33248.     "\\^{E}"                          : "\u00CA", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  33249.     "\\\"{E}"                         : "\u00CB", // LATIN CAPITAL LETTER E WITH DIAERESIS
  33250.     "\\`{I}"                          : "\u00CC", // LATIN CAPITAL LETTER I WITH GRAVE
  33251.     "\\''{I}"                          : "\u00CD", // LATIN CAPITAL LETTER I WITH ACUTE
  33252.     "\\^{I}"                          : "\u00CE", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  33253.     "\\\"{I}"                         : "\u00CF", // LATIN CAPITAL LETTER I WITH DIAERESIS
  33254.     "\\~{N}"                          : "\u00D1", // LATIN CAPITAL LETTER N WITH TILDE
  33255.     "\\`{O}"                          : "\u00D2", // LATIN CAPITAL LETTER O WITH GRAVE
  33256.     "\\''{O}"                          : "\u00D3", // LATIN CAPITAL LETTER O WITH ACUTE
  33257.     "\\^{O}"                          : "\u00D4", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  33258.     "\\~{O}"                          : "\u00D5", // LATIN CAPITAL LETTER O WITH TILDE
  33259.     "\\\"{O}"                         : "\u00D6", // LATIN CAPITAL LETTER O WITH DIAERESIS
  33260.     "\\`{U}"                          : "\u00D9", // LATIN CAPITAL LETTER U WITH GRAVE
  33261.     "\\''{U}"                          : "\u00DA", // LATIN CAPITAL LETTER U WITH ACUTE
  33262.     "\\^{U}"                          : "\u00DB", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  33263.     "\\\"{U}"                         : "\u00DC", // LATIN CAPITAL LETTER U WITH DIAERESIS
  33264.     "\\''{Y}"                          : "\u00DD", // LATIN CAPITAL LETTER Y WITH ACUTE
  33265.     "\\`{a}"                          : "\u00E0", // LATIN SMALL LETTER A WITH GRAVE
  33266.     "\\''{a}"                          : "\u00E1", // LATIN SMALL LETTER A WITH ACUTE
  33267.     "\\^{a}"                          : "\u00E2", // LATIN SMALL LETTER A WITH CIRCUMFLEX
  33268.     "\\~{a}"                          : "\u00E3", // LATIN SMALL LETTER A WITH TILDE
  33269.     "\\\"{a}"                         : "\u00E4", // LATIN SMALL LETTER A WITH DIAERESIS
  33270.     "\\c{c}"                          : "\u00E7", // LATIN SMALL LETTER C WITH CEDILLA
  33271.     "\\`{e}"                          : "\u00E8", // LATIN SMALL LETTER E WITH GRAVE
  33272.     "\\''{e}"                          : "\u00E9", // LATIN SMALL LETTER E WITH ACUTE
  33273.     "\\^{e}"                          : "\u00EA", // LATIN SMALL LETTER E WITH CIRCUMFLEX
  33274.     "\\\"{e}"                         : "\u00EB", // LATIN SMALL LETTER E WITH DIAERESIS
  33275.     "\\`{i}"                          : "\u00EC", // LATIN SMALL LETTER I WITH GRAVE
  33276.     "\\''{i}"                          : "\u00ED", // LATIN SMALL LETTER I WITH ACUTE
  33277.     "\\^{i}"                          : "\u00EE", // LATIN SMALL LETTER I WITH CIRCUMFLEX
  33278.     "\\\"{i}"                         : "\u00EF", // LATIN SMALL LETTER I WITH DIAERESIS
  33279.     "\\~{n}"                          : "\u00F1", // LATIN SMALL LETTER N WITH TILDE
  33280.     "\\`{o}"                          : "\u00F2", // LATIN SMALL LETTER O WITH GRAVE
  33281.     "\\''{o}"                          : "\u00F3", // LATIN SMALL LETTER O WITH ACUTE
  33282.     "\\^{o}"                          : "\u00F4", // LATIN SMALL LETTER O WITH CIRCUMFLEX
  33283.     "\\~{o}"                          : "\u00F5", // LATIN SMALL LETTER O WITH TILDE
  33284.     "\\\"{o}"                         : "\u00F6", // LATIN SMALL LETTER O WITH DIAERESIS
  33285.     "\\`{u}"                          : "\u00F9", // LATIN SMALL LETTER U WITH GRAVE
  33286.     "\\''{u}"                          : "\u00FA", // LATIN SMALL LETTER U WITH ACUTE
  33287.     "\\^{u}"                          : "\u00FB", // LATIN SMALL LETTER U WITH CIRCUMFLEX
  33288.     "\\\"{u}"                         : "\u00FC", // LATIN SMALL LETTER U WITH DIAERESIS
  33289.     "\\''{y}"                          : "\u00FD", // LATIN SMALL LETTER Y WITH ACUTE
  33290.     "\\\"{y}"                         : "\u00FF", // LATIN SMALL LETTER Y WITH DIAERESIS
  33291.     "\\={A}"                          : "\u0100", // LATIN CAPITAL LETTER A WITH MACRON
  33292.     "\\={a}"                          : "\u0101", // LATIN SMALL LETTER A WITH MACRON
  33293.     "\\u{A}"                          : "\u0102", // LATIN CAPITAL LETTER A WITH BREVE
  33294.     "\\u{a}"                          : "\u0103", // LATIN SMALL LETTER A WITH BREVE
  33295.     "\\k{A}"                          : "\u0104", // LATIN CAPITAL LETTER A WITH OGONEK
  33296.     "\\k{a}"                          : "\u0105", // LATIN SMALL LETTER A WITH OGONEK
  33297.     "\\''{C}"                          : "\u0106", // LATIN CAPITAL LETTER C WITH ACUTE
  33298.     "\\''{c}"                          : "\u0107", // LATIN SMALL LETTER C WITH ACUTE
  33299.     "\\^{C}"                          : "\u0108", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
  33300.     "\\^{c}"                          : "\u0109", // LATIN SMALL LETTER C WITH CIRCUMFLEX
  33301.     "\\.{C}"                          : "\u010A", // LATIN CAPITAL LETTER C WITH DOT ABOVE
  33302.     "\\.{c}"                          : "\u010B", // LATIN SMALL LETTER C WITH DOT ABOVE
  33303.     "\\v{C}"                          : "\u010C", // LATIN CAPITAL LETTER C WITH CARON
  33304.     "\\v{c}"                          : "\u010D", // LATIN SMALL LETTER C WITH CARON
  33305.     "\\v{D}"                          : "\u010E", // LATIN CAPITAL LETTER D WITH CARON
  33306.     "\\v{d}"                          : "\u010F", // LATIN SMALL LETTER D WITH CARON
  33307.     "\\={E}"                          : "\u0112", // LATIN CAPITAL LETTER E WITH MACRON
  33308.     "\\={e}"                          : "\u0113", // LATIN SMALL LETTER E WITH MACRON
  33309.     "\\u{E}"                          : "\u0114", // LATIN CAPITAL LETTER E WITH BREVE
  33310.     "\\u{e}"                          : "\u0115", // LATIN SMALL LETTER E WITH BREVE
  33311.     "\\.{E}"                          : "\u0116", // LATIN CAPITAL LETTER E WITH DOT ABOVE
  33312.     "\\.{e}"                          : "\u0117", // LATIN SMALL LETTER E WITH DOT ABOVE
  33313.     "\\k{E}"                          : "\u0118", // LATIN CAPITAL LETTER E WITH OGONEK
  33314.     "\\k{e}"                          : "\u0119", // LATIN SMALL LETTER E WITH OGONEK
  33315.     "\\v{E}"                          : "\u011A", // LATIN CAPITAL LETTER E WITH CARON
  33316.     "\\v{e}"                          : "\u011B", // LATIN SMALL LETTER E WITH CARON
  33317.     "\\^{G}"                          : "\u011C", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
  33318.     "\\^{g}"                          : "\u011D", // LATIN SMALL LETTER G WITH CIRCUMFLEX
  33319.     "\\u{G}"                          : "\u011E", // LATIN CAPITAL LETTER G WITH BREVE
  33320.     "\\u{g}"                          : "\u011F", // LATIN SMALL LETTER G WITH BREVE
  33321.     "\\.{G}"                          : "\u0120", // LATIN CAPITAL LETTER G WITH DOT ABOVE
  33322.     "\\.{g}"                          : "\u0121", // LATIN SMALL LETTER G WITH DOT ABOVE
  33323.     "\\c{G}"                          : "\u0122", // LATIN CAPITAL LETTER G WITH CEDILLA
  33324.     "\\c{g}"                          : "\u0123", // LATIN SMALL LETTER G WITH CEDILLA
  33325.     "\\^{H}"                          : "\u0124", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
  33326.     "\\^{h}"                          : "\u0125", // LATIN SMALL LETTER H WITH CIRCUMFLEX
  33327.     "\\~{I}"                          : "\u0128", // LATIN CAPITAL LETTER I WITH TILDE
  33328.     "\\~{i}"                          : "\u0129", // LATIN SMALL LETTER I WITH TILDE
  33329.     "\\={I}"                          : "\u012A", // LATIN CAPITAL LETTER I WITH MACRON
  33330.     "\\={i}"                          : "\u012B", // LATIN SMALL LETTER I WITH MACRON
  33331.     "\\u{I}"                          : "\u012C", // LATIN CAPITAL LETTER I WITH BREVE
  33332.     "\\u{i}"                          : "\u012D", // LATIN SMALL LETTER I WITH BREVE
  33333.     "\\k{I}"                          : "\u012E", // LATIN CAPITAL LETTER I WITH OGONEK
  33334.     "\\k{i}"                          : "\u012F", // LATIN SMALL LETTER I WITH OGONEK
  33335.     "\\.{I}"                          : "\u0130", // LATIN CAPITAL LETTER I WITH DOT ABOVE
  33336.     "\\^{J}"                          : "\u0134", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
  33337.     "\\^{j}"                          : "\u0135", // LATIN SMALL LETTER J WITH CIRCUMFLEX
  33338.     "\\c{K}"                          : "\u0136", // LATIN CAPITAL LETTER K WITH CEDILLA
  33339.     "\\c{k}"                          : "\u0137", // LATIN SMALL LETTER K WITH CEDILLA
  33340.     "\\''{L}"                          : "\u0139", // LATIN CAPITAL LETTER L WITH ACUTE
  33341.     "\\''{l}"                          : "\u013A", // LATIN SMALL LETTER L WITH ACUTE
  33342.     "\\c{L}"                          : "\u013B", // LATIN CAPITAL LETTER L WITH CEDILLA
  33343.     "\\c{l}"                          : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA
  33344.     "\\v{L}"                          : "\u013D", // LATIN CAPITAL LETTER L WITH CARON
  33345.     "\\v{l}"                          : "\u013E", // LATIN SMALL LETTER L WITH CARON
  33346.     "\\''{N}"                          : "\u0143", // LATIN CAPITAL LETTER N WITH ACUTE
  33347.     "\\''{n}"                          : "\u0144", // LATIN SMALL LETTER N WITH ACUTE
  33348.     "\\c{N}"                          : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA
  33349.     "\\c{n}"                          : "\u0146", // LATIN SMALL LETTER N WITH CEDILLA
  33350.     "\\v{N}"                          : "\u0147", // LATIN CAPITAL LETTER N WITH CARON
  33351.     "\\v{n}"                          : "\u0148", // LATIN SMALL LETTER N WITH CARON
  33352.     "\\={O}"                          : "\u014C", // LATIN CAPITAL LETTER O WITH MACRON
  33353.     "\\={o}"                          : "\u014D", // LATIN SMALL LETTER O WITH MACRON
  33354.     "\\u{O}"                          : "\u014E", // LATIN CAPITAL LETTER O WITH BREVE
  33355.     "\\u{o}"                          : "\u014F", // LATIN SMALL LETTER O WITH BREVE
  33356.     "\\H{O}"                          : "\u0150", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
  33357.     "\\H{o}"                          : "\u0151", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
  33358.     "\\''{R}"                          : "\u0154", // LATIN CAPITAL LETTER R WITH ACUTE
  33359.     "\\''{r}"                          : "\u0155", // LATIN SMALL LETTER R WITH ACUTE
  33360.     "\\c{R}"                          : "\u0156", // LATIN CAPITAL LETTER R WITH CEDILLA
  33361.     "\\c{r}"                          : "\u0157", // LATIN SMALL LETTER R WITH CEDILLA
  33362.     "\\v{R}"                          : "\u0158", // LATIN CAPITAL LETTER R WITH CARON
  33363.     "\\v{r}"                          : "\u0159", // LATIN SMALL LETTER R WITH CARON
  33364.     "\\''{S}"                          : "\u015A", // LATIN CAPITAL LETTER S WITH ACUTE
  33365.     "\\''{s}"                          : "\u015B", // LATIN SMALL LETTER S WITH ACUTE
  33366.     "\\^{S}"                          : "\u015C", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
  33367.     "\\^{s}"                          : "\u015D", // LATIN SMALL LETTER S WITH CIRCUMFLEX
  33368.     "\\c{S}"                          : "\u015E", // LATIN CAPITAL LETTER S WITH CEDILLA
  33369.     "\\c{s}"                          : "\u015F", // LATIN SMALL LETTER S WITH CEDILLA
  33370.     "\\v{S}"                          : "\u0160", // LATIN CAPITAL LETTER S WITH CARON
  33371.     "\\v{s}"                          : "\u0161", // LATIN SMALL LETTER S WITH CARON
  33372.     "\\c{T}"                          : "\u0162", // LATIN CAPITAL LETTER T WITH CEDILLA
  33373.     "\\c{t}"                          : "\u0163", // LATIN SMALL LETTER T WITH CEDILLA
  33374.     "\\v{T}"                          : "\u0164", // LATIN CAPITAL LETTER T WITH CARON
  33375.     "\\v{t}"                          : "\u0165", // LATIN SMALL LETTER T WITH CARON
  33376.     "\\~{U}"                          : "\u0168", // LATIN CAPITAL LETTER U WITH TILDE
  33377.     "\\~{u}"                          : "\u0169", // LATIN SMALL LETTER U WITH TILDE
  33378.     "\\={U}"                          : "\u016A", // LATIN CAPITAL LETTER U WITH MACRON
  33379.     "\\={u}"                          : "\u016B", // LATIN SMALL LETTER U WITH MACRON
  33380.     "\\u{U}"                          : "\u016C", // LATIN CAPITAL LETTER U WITH BREVE
  33381.     "\\u{u}"                          : "\u016D", // LATIN SMALL LETTER U WITH BREVE
  33382.     "\\H{U}"                          : "\u0170", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
  33383.     "\\H{u}"                          : "\u0171", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
  33384.     "\\k{U}"                          : "\u0172", // LATIN CAPITAL LETTER U WITH OGONEK
  33385.     "\\k{u}"                          : "\u0173", // LATIN SMALL LETTER U WITH OGONEK
  33386.     "\\^{W}"                          : "\u0174", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
  33387.     "\\^{w}"                          : "\u0175", // LATIN SMALL LETTER W WITH CIRCUMFLEX
  33388.     "\\^{Y}"                          : "\u0176", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
  33389.     "\\^{y}"                          : "\u0177", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
  33390.     "\\\"{Y}"                         : "\u0178", // LATIN CAPITAL LETTER Y WITH DIAERESIS
  33391.     "\\''{Z}"                          : "\u0179", // LATIN CAPITAL LETTER Z WITH ACUTE
  33392.     "\\''{z}"                          : "\u017A", // LATIN SMALL LETTER Z WITH ACUTE
  33393.     "\\.{Z}"                          : "\u017B", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
  33394.     "\\.{z}"                          : "\u017C", // LATIN SMALL LETTER Z WITH DOT ABOVE
  33395.     "\\v{Z}"                          : "\u017D", // LATIN CAPITAL LETTER Z WITH CARON
  33396.     "\\v{z}"                          : "\u017E", // LATIN SMALL LETTER Z WITH CARON
  33397.     "\\v{A}"                          : "\u01CD", // LATIN CAPITAL LETTER A WITH CARON
  33398.     "\\v{a}"                          : "\u01CE", // LATIN SMALL LETTER A WITH CARON
  33399.     "\\v{I}"                          : "\u01CF", // LATIN CAPITAL LETTER I WITH CARON
  33400.     "\\v{i}"                          : "\u01D0", // LATIN SMALL LETTER I WITH CARON
  33401.     "\\v{O}"                          : "\u01D1", // LATIN CAPITAL LETTER O WITH CARON
  33402.     "\\v{o}"                          : "\u01D2", // LATIN SMALL LETTER O WITH CARON
  33403.     "\\v{U}"                          : "\u01D3", // LATIN CAPITAL LETTER U WITH CARON
  33404.     "\\v{u}"                          : "\u01D4", // LATIN SMALL LETTER U WITH CARON
  33405.     "\\v{G}"                          : "\u01E6", // LATIN CAPITAL LETTER G WITH CARON
  33406.     "\\v{g}"                          : "\u01E7", // LATIN SMALL LETTER G WITH CARON
  33407.     "\\v{K}"                          : "\u01E8", // LATIN CAPITAL LETTER K WITH CARON
  33408.     "\\v{k}"                          : "\u01E9", // LATIN SMALL LETTER K WITH CARON
  33409.     "\\k{O}"                          : "\u01EA", // LATIN CAPITAL LETTER O WITH OGONEK
  33410.     "\\k{o}"                          : "\u01EB", // LATIN SMALL LETTER O WITH OGONEK
  33411.     "\\v{j}"                          : "\u01F0", // LATIN SMALL LETTER J WITH CARON
  33412.     "\\''{G}"                          : "\u01F4", // LATIN CAPITAL LETTER G WITH ACUTE
  33413.     "\\''{g}"                          : "\u01F5", // LATIN SMALL LETTER G WITH ACUTE
  33414.     "\\.{B}"                          : "\u1E02", // LATIN CAPITAL LETTER B WITH DOT ABOVE
  33415.     "\\.{b}"                          : "\u1E03", // LATIN SMALL LETTER B WITH DOT ABOVE
  33416.     "\\d{B}"                          : "\u1E04", // LATIN CAPITAL LETTER B WITH DOT BELOW
  33417.     "\\d{b}"                          : "\u1E05", // LATIN SMALL LETTER B WITH DOT BELOW
  33418.     "\\b{B}"                          : "\u1E06", // LATIN CAPITAL LETTER B WITH LINE BELOW
  33419.     "\\b{b}"                          : "\u1E07", // LATIN SMALL LETTER B WITH LINE BELOW
  33420.     "\\.{D}"                          : "\u1E0A", // LATIN CAPITAL LETTER D WITH DOT ABOVE
  33421.     "\\.{d}"                          : "\u1E0B", // LATIN SMALL LETTER D WITH DOT ABOVE
  33422.     "\\d{D}"                          : "\u1E0C", // LATIN CAPITAL LETTER D WITH DOT BELOW
  33423.     "\\d{d}"                          : "\u1E0D", // LATIN SMALL LETTER D WITH DOT BELOW
  33424.     "\\b{D}"                          : "\u1E0E", // LATIN CAPITAL LETTER D WITH LINE BELOW
  33425.     "\\b{d}"                          : "\u1E0F", // LATIN SMALL LETTER D WITH LINE BELOW
  33426.     "\\c{D}"                          : "\u1E10", // LATIN CAPITAL LETTER D WITH CEDILLA
  33427.     "\\c{d}"                          : "\u1E11", // LATIN SMALL LETTER D WITH CEDILLA
  33428.     "\\.{F}"                          : "\u1E1E", // LATIN CAPITAL LETTER F WITH DOT ABOVE
  33429.     "\\.{f}"                          : "\u1E1F", // LATIN SMALL LETTER F WITH DOT ABOVE
  33430.     "\\={G}"                          : "\u1E20", // LATIN CAPITAL LETTER G WITH MACRON
  33431.     "\\={g}"                          : "\u1E21", // LATIN SMALL LETTER G WITH MACRON
  33432.     "\\.{H}"                          : "\u1E22", // LATIN CAPITAL LETTER H WITH DOT ABOVE
  33433.     "\\.{h}"                          : "\u1E23", // LATIN SMALL LETTER H WITH DOT ABOVE
  33434.     "\\d{H}"                          : "\u1E24", // LATIN CAPITAL LETTER H WITH DOT BELOW
  33435.     "\\d{h}"                          : "\u1E25", // LATIN SMALL LETTER H WITH DOT BELOW
  33436.     "\\\"{H}"                         : "\u1E26", // LATIN CAPITAL LETTER H WITH DIAERESIS
  33437.     "\\\"{h}"                         : "\u1E27", // LATIN SMALL LETTER H WITH DIAERESIS
  33438.     "\\c{H}"                          : "\u1E28", // LATIN CAPITAL LETTER H WITH CEDILLA
  33439.     "\\c{h}"                          : "\u1E29", // LATIN SMALL LETTER H WITH CEDILLA
  33440.     "\\''{K}"                          : "\u1E30", // LATIN CAPITAL LETTER K WITH ACUTE
  33441.     "\\''{k}"                          : "\u1E31", // LATIN SMALL LETTER K WITH ACUTE
  33442.     "\\d{K}"                          : "\u1E32", // LATIN CAPITAL LETTER K WITH DOT BELOW
  33443.     "\\d{k}"                          : "\u1E33", // LATIN SMALL LETTER K WITH DOT BELOW
  33444.     "\\b{K}"                          : "\u1E34", // LATIN CAPITAL LETTER K WITH LINE BELOW
  33445.     "\\b{k}"                          : "\u1E35", // LATIN SMALL LETTER K WITH LINE BELOW
  33446.     "\\d{L}"                          : "\u1E36", // LATIN CAPITAL LETTER L WITH DOT BELOW
  33447.     "\\d{l}"                          : "\u1E37", // LATIN SMALL LETTER L WITH DOT BELOW
  33448.     "\\b{L}"                          : "\u1E3A", // LATIN CAPITAL LETTER L WITH LINE BELOW
  33449.     "\\b{l}"                          : "\u1E3B", // LATIN SMALL LETTER L WITH LINE BELOW
  33450.     "\\''{M}"                          : "\u1E3E", // LATIN CAPITAL LETTER M WITH ACUTE
  33451.     "\\''{m}"                          : "\u1E3F", // LATIN SMALL LETTER M WITH ACUTE
  33452.     "\\.{M}"                          : "\u1E40", // LATIN CAPITAL LETTER M WITH DOT ABOVE
  33453.     "\\.{m}"                          : "\u1E41", // LATIN SMALL LETTER M WITH DOT ABOVE
  33454.     "\\d{M}"                          : "\u1E42", // LATIN CAPITAL LETTER M WITH DOT BELOW
  33455.     "\\d{m}"                          : "\u1E43", // LATIN SMALL LETTER M WITH DOT BELOW
  33456.     "\\.{N}"                          : "\u1E44", // LATIN CAPITAL LETTER N WITH DOT ABOVE
  33457.     "\\.{n}"                          : "\u1E45", // LATIN SMALL LETTER N WITH DOT ABOVE
  33458.     "\\d{N}"                          : "\u1E46", // LATIN CAPITAL LETTER N WITH DOT BELOW
  33459.     "\\d{n}"                          : "\u1E47", // LATIN SMALL LETTER N WITH DOT BELOW
  33460.     "\\b{N}"                          : "\u1E48", // LATIN CAPITAL LETTER N WITH LINE BELOW
  33461.     "\\b{n}"                          : "\u1E49", // LATIN SMALL LETTER N WITH LINE BELOW
  33462.     "\\''{P}"                          : "\u1E54", // LATIN CAPITAL LETTER P WITH ACUTE
  33463.     "\\''{p}"                          : "\u1E55", // LATIN SMALL LETTER P WITH ACUTE
  33464.     "\\.{P}"                          : "\u1E56", // LATIN CAPITAL LETTER P WITH DOT ABOVE
  33465.     "\\.{p}"                          : "\u1E57", // LATIN SMALL LETTER P WITH DOT ABOVE
  33466.     "\\.{R}"                          : "\u1E58", // LATIN CAPITAL LETTER R WITH DOT ABOVE
  33467.     "\\.{r}"                          : "\u1E59", // LATIN SMALL LETTER R WITH DOT ABOVE
  33468.     "\\d{R}"                          : "\u1E5A", // LATIN CAPITAL LETTER R WITH DOT BELOW
  33469.     "\\d{r}"                          : "\u1E5B", // LATIN SMALL LETTER R WITH DOT BELOW
  33470.     "\\b{R}"                          : "\u1E5E", // LATIN CAPITAL LETTER R WITH LINE BELOW
  33471.     "\\b{r}"                          : "\u1E5F", // LATIN SMALL LETTER R WITH LINE BELOW
  33472.     "\\.{S}"                          : "\u1E60", // LATIN CAPITAL LETTER S WITH DOT ABOVE
  33473.     "\\.{s}"                          : "\u1E61", // LATIN SMALL LETTER S WITH DOT ABOVE
  33474.     "\\d{S}"                          : "\u1E62", // LATIN CAPITAL LETTER S WITH DOT BELOW
  33475.     "\\d{s}"                          : "\u1E63", // LATIN SMALL LETTER S WITH DOT BELOW
  33476.     "\\.{T}"                          : "\u1E6A", // LATIN CAPITAL LETTER T WITH DOT ABOVE
  33477.     "\\.{t}"                          : "\u1E6B", // LATIN SMALL LETTER T WITH DOT ABOVE
  33478.     "\\d{T}"                          : "\u1E6C", // LATIN CAPITAL LETTER T WITH DOT BELOW
  33479.     "\\d{t}"                          : "\u1E6D", // LATIN SMALL LETTER T WITH DOT BELOW
  33480.     "\\b{T}"                          : "\u1E6E", // LATIN CAPITAL LETTER T WITH LINE BELOW
  33481.     "\\b{t}"                          : "\u1E6F", // LATIN SMALL LETTER T WITH LINE BELOW
  33482.     "\\~{V}"                          : "\u1E7C", // LATIN CAPITAL LETTER V WITH TILDE
  33483.     "\\~{v}"                          : "\u1E7D", // LATIN SMALL LETTER V WITH TILDE
  33484.     "\\d{V}"                          : "\u1E7E", // LATIN CAPITAL LETTER V WITH DOT BELOW
  33485.     "\\d{v}"                          : "\u1E7F", // LATIN SMALL LETTER V WITH DOT BELOW
  33486.     "\\`{W}"                          : "\u1E80", // LATIN CAPITAL LETTER W WITH GRAVE
  33487.     "\\`{w}"                          : "\u1E81", // LATIN SMALL LETTER W WITH GRAVE
  33488.     "\\''{W}"                          : "\u1E82", // LATIN CAPITAL LETTER W WITH ACUTE
  33489.     "\\''{w}"                          : "\u1E83", // LATIN SMALL LETTER W WITH ACUTE
  33490.     "\\\"{W}"                         : "\u1E84", // LATIN CAPITAL LETTER W WITH DIAERESIS
  33491.     "\\\"{w}"                         : "\u1E85", // LATIN SMALL LETTER W WITH DIAERESIS
  33492.     "\\.{W}"                          : "\u1E86", // LATIN CAPITAL LETTER W WITH DOT ABOVE
  33493.     "\\.{w}"                          : "\u1E87", // LATIN SMALL LETTER W WITH DOT ABOVE
  33494.     "\\d{W}"                          : "\u1E88", // LATIN CAPITAL LETTER W WITH DOT BELOW
  33495.     "\\d{w}"                          : "\u1E89", // LATIN SMALL LETTER W WITH DOT BELOW
  33496.     "\\.{X}"                          : "\u1E8A", // LATIN CAPITAL LETTER X WITH DOT ABOVE
  33497.     "\\.{x}"                          : "\u1E8B", // LATIN SMALL LETTER X WITH DOT ABOVE
  33498.     "\\\"{X}"                         : "\u1E8C", // LATIN CAPITAL LETTER X WITH DIAERESIS
  33499.     "\\\"{x}"                         : "\u1E8D", // LATIN SMALL LETTER X WITH DIAERESIS
  33500.     "\\.{Y}"                          : "\u1E8E", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
  33501.     "\\.{y}"                          : "\u1E8F", // LATIN SMALL LETTER Y WITH DOT ABOVE
  33502.     "\\^{Z}"                          : "\u1E90", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
  33503.     "\\^{z}"                          : "\u1E91", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
  33504.     "\\d{Z}"                          : "\u1E92", // LATIN CAPITAL LETTER Z WITH DOT BELOW
  33505.     "\\d{z}"                          : "\u1E93", // LATIN SMALL LETTER Z WITH DOT BELOW
  33506.     "\\b{Z}"                          : "\u1E94", // LATIN CAPITAL LETTER Z WITH LINE BELOW
  33507.     "\\b{z}"                          : "\u1E95", // LATIN SMALL LETTER Z WITH LINE BELOW
  33508.     "\\b{h}"                          : "\u1E96", // LATIN SMALL LETTER H WITH LINE BELOW
  33509.     "\\\"{t}"                         : "\u1E97", // LATIN SMALL LETTER T WITH DIAERESIS
  33510.     "\\d{A}"                          : "\u1EA0", // LATIN CAPITAL LETTER A WITH DOT BELOW
  33511.     "\\d{a}"                          : "\u1EA1", // LATIN SMALL LETTER A WITH DOT BELOW
  33512.     "\\d{E}"                          : "\u1EB8", // LATIN CAPITAL LETTER E WITH DOT BELOW
  33513.     "\\d{e}"                          : "\u1EB9", // LATIN SMALL LETTER E WITH DOT BELOW
  33514.     "\\~{E}"                          : "\u1EBC", // LATIN CAPITAL LETTER E WITH TILDE
  33515.     "\\~{e}"                          : "\u1EBD", // LATIN SMALL LETTER E WITH TILDE
  33516.     "\\d{I}"                          : "\u1ECA", // LATIN CAPITAL LETTER I WITH DOT BELOW
  33517.     "\\d{i}"                          : "\u1ECB", // LATIN SMALL LETTER I WITH DOT BELOW
  33518.     "\\d{O}"                          : "\u1ECC", // LATIN CAPITAL LETTER O WITH DOT BELOW
  33519.     "\\d{o}"                          : "\u1ECD", // LATIN SMALL LETTER O WITH DOT BELOW
  33520.     "\\d{U}"                          : "\u1EE4", // LATIN CAPITAL LETTER U WITH DOT BELOW
  33521.     "\\d{u}"                          : "\u1EE5", // LATIN SMALL LETTER U WITH DOT BELOW
  33522.     "\\`{Y}"                          : "\u1EF2", // LATIN CAPITAL LETTER Y WITH GRAVE
  33523.     "\\`{y}"                          : "\u1EF3", // LATIN SMALL LETTER Y WITH GRAVE
  33524.     "\\d{Y}"                          : "\u1EF4", // LATIN CAPITAL LETTER Y WITH DOT BELOW
  33525.     "\\d{y}"                          : "\u1EF5", // LATIN SMALL LETTER Y WITH DOT BELOW
  33526.     "\\~{Y}"                          : "\u1EF8", // LATIN CAPITAL LETTER Y WITH TILDE
  33527.     "\\~{y}"                          : "\u1EF9", // LATIN SMALL LETTER Y WITH TILDE
  33528. };
  33529.  
  33530. var alwaysMap = {
  33531.     "|":"{\\textbar}",
  33532.     "<":"{\\textless}",
  33533.     ">":"{\\textgreater}",
  33534.     "~":"{\\textasciitilde}",
  33535.     "^":"{\\textasciicircum}",
  33536.     "\\":"{\\textbackslash}"
  33537. };
  33538.  
  33539. var strings = new Object();
  33540. var keyRe = /[a-zA-Z0-9\-]/;
  33541.  
  33542. function processField(item, field, value) {
  33543.     if(fieldMap[field]) {
  33544.         item[fieldMap[field]] = value;
  33545.     } else if(inputFieldMap[field]) {
  33546.         item[inputFieldMap[field]] = value;
  33547.     } else if(field == "journal") {
  33548.         if(item.publicationTitle) {
  33549.             // we already had an fjournal
  33550.             item.journalAbbreviation = value
  33551.         } else {
  33552.             item.publicationTitle = value;
  33553.         }
  33554.     } else if(field == "fjournal") {
  33555.         if(item.publicationTitle) {
  33556.             // move publicationTitle to abbreviation
  33557.             item.journalAbbreviation = value;
  33558.         }
  33559.         item.publicationTitle = value;
  33560.     } else if(field == "author" || field == "editor") {
  33561.         // parse authors/editors
  33562.         var names = value.split(/ and /i); // now case insensitive
  33563.         for each(var name in names) {
  33564.             item.creators.push(Zotero.Utilities.cleanAuthor(name, field,
  33565.                                               (name.indexOf(",") != -1)));
  33566.         }
  33567.     } else if(field == "institution" || field == "organization") {
  33568.         item.backupPublisher = value;
  33569.     } else if(field == "number"){ // fix for techreport
  33570.         if (item.itemType == "report") {
  33571.             item.reportNumber = value;
  33572.         } else {
  33573.             item.issue = value;
  33574.         }
  33575.     } else if(field == "month") {
  33576.         var monthIndex = months.indexOf(value.toLowerCase());
  33577.         if(monthIndex != -1) {
  33578.             value = Zotero.Utilities.formatDate({month:monthIndex});
  33579.         } else {
  33580.             value += " ";
  33581.         }
  33582.         
  33583.         if(item.date) {
  33584.             if(value.indexOf(item.date) != -1) {
  33585.                 // value contains year and more
  33586.                 item.date = value;
  33587.             } else {
  33588.                 item.date = value+item.date;
  33589.             }
  33590.         } else {
  33591.             item.date = value;
  33592.         }
  33593.     } else if(field == "year") {
  33594.         if(item.date) {
  33595.             if(item.date.indexOf(value) == -1) {
  33596.                 // date does not already contain year
  33597.                 item.date += value;
  33598.             }
  33599.         } else {
  33600.             item.date = value;
  33601.         }
  33602.     } else if(field == "pages") {
  33603.         item.pages = value.replace(/--/g, "-");
  33604.     } else if(field == "note" || field == "annote") {
  33605.         item.extra += "\n"+value;
  33606.     } else if(field == "howpublished") {
  33607.         if(value.length >= 7) {
  33608.             var str = value.substr(0, 7);
  33609.             if(str == "http://" || str == "https:/" || str == "mailto:") {
  33610.                 item.url = value;
  33611.             } else {
  33612.                 item.extra += "\nPublished: "+value;
  33613.             }
  33614.         }
  33615.     } else if(field == "keywords") {
  33616.         if(value.indexOf(",") == -1) {
  33617.             // keywords/tags
  33618.             item.tags = value.split(" ");
  33619.         } else {
  33620.             item.tags = value.split(/, ?/g);
  33621.         }
  33622.     } else if (field == "comment") {
  33623.         item.notes.push({note:value});
  33624.     } else if(field == "pdf") { // new code to handle PDF import. absolute file path should be specified in bibtex
  33625.         item.attachments = [{url:"file://"+value, mimeType:"application/pdf"}];
  33626.     }
  33627. }
  33628.  
  33629. function getFieldValue(read) {
  33630.     var value = "";
  33631.     // now, we have the first character of the field
  33632.     if(read == "{") {
  33633.         // character is a brace
  33634.         var openBraces = 1;
  33635.         while(read = Zotero.read(1)) {
  33636.             if(read == "{" && value[value.length-1] != "\\") {
  33637.                 openBraces++;
  33638.                 value += "{";
  33639.             } else if(read == "}" && value[value.length-1] != "\\") {
  33640.                 openBraces--;
  33641.                 if(openBraces == 0) {
  33642.                     break;
  33643.                 } else {
  33644.                     value += "}";
  33645.                 }
  33646.             } else {
  33647.                 value += read;
  33648.             }
  33649.         }
  33650.     } else if(read == ''"'') {
  33651.         var openBraces = 0;
  33652.         while(read = Zotero.read(1)) {
  33653.             if(read == "{" && value[value.length-1] != "\\") {
  33654.                 openBraces++;
  33655.                 value += "{";
  33656.             } else if(read == "}" && value[value.length-1] != "\\") {
  33657.                 openBraces--;
  33658.                 value += "}";
  33659.             } else if(read == ''"'' && openBraces == 0) {
  33660.                 break;
  33661.             } else {
  33662.                 value += read;
  33663.             }
  33664.         }
  33665.     }
  33666.     
  33667.     if(value.length > 1) {
  33668.         // replace accented characters (yucky slow)
  33669.         value = value.replace(/{(\\[`"''^~=a-z])([A-Za-z])}/g, "$1{$2}");
  33670.         for (var mapped in reversemappingTable) { // really really slow!
  33671.             var unicode = reversemappingTable[mapped];
  33672.             if (value.indexOf(mapped) != -1) {
  33673.                 Zotero.debug("Replace " + mapped + " in " + value + " with " + unicode);
  33674.                 value = value.replace(mapped, unicode, "g");
  33675.             }
  33676.             mapped = mapped.replace(/[{}]/, "");
  33677.             if (value.indexOf(mapped) != -1) {
  33678.                 Zotero.debug("Replace(2) " + mapped + " in " + value + " with " + unicode);
  33679.                 value = value.replace(mapped, unicode, "g");
  33680.             }
  33681.         }
  33682.         
  33683.         // kill braces
  33684.         value = value.replace(/([^\\])[{}]+/g, "$1");
  33685.         if(value[0] == "{") {
  33686.             value = value.substr(1);
  33687.         }
  33688.         
  33689.         // chop off backslashes
  33690.         value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2");
  33691.         value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2");
  33692.         if(value[0] == "\\" && "#$%&~_^\\{}".indexOf(value[1]) != -1) {
  33693.             value = value.substr(1);
  33694.         }
  33695.         if(value[value.length-1] == "\\" &&  "#$%&~_^\\{}".indexOf(value[value.length-2]) != -1) {
  33696.             value = value.substr(0, value.length-1);
  33697.         }
  33698.         value = value.replace(/\\\\/g, "\\");
  33699.         value = value.replace(/\s+/g, " ");
  33700.     }
  33701.     
  33702.     return value;
  33703. }
  33704.  
  33705. function beginRecord(type, closeChar) {
  33706.     type = Zotero.Utilities.cleanString(type.toLowerCase());
  33707.     if(type != "string") {
  33708.         var zoteroType = bibtex2zoteroTypeMap[type];
  33709.         if (!zoteroType) {
  33710.             Zotero.debug("discarded item from BibTeX; type was "+type);
  33711.         }
  33712.         var item = new Zotero.Item(zoteroType);
  33713.         
  33714.         item.extra = "";
  33715.     }
  33716.     
  33717.     var field = "";
  33718.     
  33719.     // by setting dontRead to true, we can skip a read on the next iteration
  33720.     // of this loop. this is useful after we read past the end of a string.
  33721.     var dontRead = false;
  33722.     
  33723.     while(dontRead || (read = Zotero.read(1))) {
  33724.         dontRead = false;
  33725.         
  33726.         if(read == "=") {                                // equals begin a field
  33727.         // read whitespace
  33728.             var read = Zotero.read(1);
  33729.             while(" \n\r\t".indexOf(read) != -1) {
  33730.                 read = Zotero.read(1);
  33731.             }
  33732.             
  33733.             if(keyRe.test(read)) {
  33734.                 // read numeric data here, since we might get an end bracket
  33735.                 // that we should care about
  33736.                 value = "";
  33737.                 value += read;
  33738.                 
  33739.                 // character is a number
  33740.                 while((read = Zotero.read(1)) && keyRe.test(read)) {
  33741.                     value += read;
  33742.                 }
  33743.                 
  33744.                 // don''t read the next char; instead, process the character
  33745.                 // we already read past the end of the string
  33746.                 dontRead = true;
  33747.                 
  33748.                 // see if there''s a defined string
  33749.                 if(strings[value]) value = strings[value];
  33750.             } else {
  33751.                 var value = getFieldValue(read);
  33752.             }
  33753.             
  33754.             if(item) {
  33755.                 processField(item, field.toLowerCase(), value);
  33756.             } else if(type == "string") {
  33757.                 strings[field] = value;
  33758.             }
  33759.             field = "";
  33760.         } else if(read == ",") {                        // commas reset
  33761.             field = "";
  33762.         } else if(read == closeChar) {
  33763.             if(item) {
  33764.                 if(item.extra) item.extra = item.extra.substr(1); // chop \n
  33765.                 item.complete();
  33766.             }
  33767.             return;
  33768.         } else if(" \n\r\t".indexOf(read) == -1) {        // skip whitespace
  33769.             field += read;
  33770.         }
  33771.     }
  33772. }
  33773.  
  33774. function doImport() {
  33775.     var read = "", text = "", recordCloseElement = false;
  33776.     var type = false;
  33777.     
  33778.     while(read = Zotero.read(1)) {
  33779.         if(read == "@") {
  33780.             type = "";
  33781.         } else if(type !== false) {
  33782.             if(type == "comment") {
  33783.                 type = false;
  33784.             } else if(read == "{") {        // possible open character
  33785.                 beginRecord(type, "}");
  33786.                 type = false;
  33787.             } else if(read == "(") {        // possible open character
  33788.                 beginRecord(type, ")");
  33789.                 type = false;
  33790.             } else {
  33791.                 type += read;
  33792.             }
  33793.         }
  33794.     }
  33795. }
  33796.  
  33797. // some fields are, in fact, macros.  If that is the case then we should not put the
  33798. // data in the braces as it will cause the macros to not expand properly
  33799. function writeField(field, value, isMacro) {
  33800.     if(!value) return;
  33801.     value = value + ""; // convert integers to strings
  33802.     Zotero.write(",\n\t"+field+" = ");
  33803.     if(!isMacro) Zotero.write("{");
  33804.     // url field is preserved, for use with \href and \url
  33805.     // Other fields (DOI?) may need similar treatment
  33806.     if(field != "url") {
  33807.         // I hope these are all the escape characters!
  33808.         value = value.replace(/[|\<\>\~\^\\]/g, mapEscape).replace(/([\#\$\%\&\_])/g, "\\$1");
  33809.         // Case of words with uppercase characters in non-initial positions is preserved with braces.
  33810.         if(!isMacro) value = value.replace(/([^\s]+[A-Z][^\s]*)/g, "{$1}");
  33811.     }
  33812.     if (Zotero.getOption("exportCharset") != "UTF-8") {
  33813.         value = value.replace(/[\u0080-\uFFFF]/g, mapAccent);
  33814.     }
  33815.     Zotero.write(value);
  33816.     if(!isMacro) Zotero.write("}");
  33817. }
  33818.  
  33819. function mapEscape(character) {
  33820.     return alwaysMap[character];
  33821. }
  33822.  
  33823. function mapAccent(character) {
  33824.     return (mappingTable[character] ? mappingTable[character] : "?");
  33825. }
  33826.  
  33827. var numberRe = /^[0-9]+/;
  33828. // this is a list of words that should not appear as part of the citation key
  33829. var citeKeyTitleBannedRe = /(\s+|\b)(a|an|from|does|how|it\''s|its|on|some|the|this|why)(\s+|\b)/g;
  33830. var citeKeyConversionsRe = /%([a-zA-Z])/;
  33831. var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;
  33832.  
  33833. var citeKeyConversions = {
  33834.     "a":function (flags, item) {
  33835.         if(item.creators && item.creators[0] && item.creators[0].lastName) {
  33836.             return item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,"");
  33837.         }
  33838.         return "";
  33839.     },
  33840.     "t":function (flags, item) {
  33841.         if (item["title"]) {
  33842.             return item["title"].toLowerCase().replace(citeKeyTitleBannedRe, "").split(" ")[0];
  33843.         }
  33844.         return "";
  33845.     },
  33846.     "y":function (flags, item) {
  33847.         if(item.date) {
  33848.             var date = Zotero.Utilities.strToDate(item.date);
  33849.             if(date.year && numberRe.test(date.year)) {
  33850.                 return date.year;
  33851.             }
  33852.         }
  33853.         return "????";
  33854.     }
  33855. }
  33856.  
  33857.  
  33858. function buildCiteKey (item,citekeys) {
  33859.     var basekey = "";
  33860.     var counter = 0;
  33861.     citeKeyFormatRemaining = citeKeyFormat;
  33862.     while (citeKeyConversionsRe.test(citeKeyFormatRemaining)) {
  33863.         if (counter > 100) {
  33864.             Zotero.debug("Pathological BibTeX format: " + citeKeyFormat);
  33865.             break;
  33866.         }
  33867.         var m = citeKeyFormatRemaining.match(citeKeyConversionsRe);
  33868.         if (m.index > 0) {
  33869.             //add data before the conversion match to basekey
  33870.             basekey = basekey + citeKeyFormatRemaining.substr(0, m.index);
  33871.         }
  33872.         var flags = ""; // for now
  33873.         var f = citeKeyConversions[m[1]];
  33874.         if (typeof(f) == "function") {
  33875.             var value = f(flags, item);
  33876.             Zotero.debug("Got value " + value + " for %" + m[1]);
  33877.             //add conversion to basekey
  33878.             basekey = basekey + value;
  33879.         }
  33880.         citeKeyFormatRemaining = citeKeyFormatRemaining.substr(m.index + m.length);
  33881.         counter++;
  33882.     }
  33883.     if (citeKeyFormatRemaining.length > 0) {
  33884.         basekey = basekey + citeKeyFormatRemaining;
  33885.     }
  33886.  
  33887.     // for now, remove any characters not explicitly known to be allowed;
  33888.     // we might want to allow UTF-8 citation keys in the future, depending
  33889.     // on implementation support.
  33890.     //
  33891.     // no matter what, we want to make sure we exclude
  33892.     // " # % '' ( ) , = { } ~ and backslash
  33893.  
  33894.     basekey = basekey.replace(citeKeyCleanRe, "");
  33895.     var citekey = basekey;
  33896.     var i = 0;
  33897.     while(citekeys[citekey]) {
  33898.         i++;
  33899.         citekey = basekey + "-" + i;
  33900.     }
  33901.     citekeys[citekey] = true;
  33902.     return citekey;
  33903. }
  33904.  
  33905. function doExport() {
  33906.     //Zotero.write("% BibTeX export generated by Zotero "+Zotero.Utilities.getVersion());
  33907.     // to make sure the BOM gets ignored
  33908.     Zotero.write("\n");
  33909.     
  33910.     var first = true;
  33911.     var citekeys = new Object();
  33912.     var item;
  33913.     while(item = Zotero.nextItem()) {
  33914.         // determine type
  33915.         var type = zotero2bibtexTypeMap[item.itemType];
  33916.         if (typeof(type) == "function") { type = type(item); }
  33917.         if(!type) type = "misc";
  33918.         
  33919.         // create a unique citation key
  33920.         var citekey = buildCiteKey(item, citekeys);
  33921.         
  33922.         // write citation key
  33923.         Zotero.write((first ? "" : ",\n\n") + "@"+type+"{"+citekey);
  33924.         first = false;
  33925.         
  33926.         for(var field in fieldMap) {
  33927.             if(item[fieldMap[field]]) {
  33928.                 writeField(field, item[fieldMap[field]]);
  33929.             }
  33930.         }
  33931.  
  33932.         if(item.reportNumber || item.issue) {
  33933.             writeField("number", item.reportNumber || item.issue);
  33934.         }
  33935.  
  33936.         if(item.publicationTitle) {
  33937.             if(item.itemType == "bookSection" || item.itemType == "conferencePaper") {
  33938.                 writeField("booktitle", item.publicationTitle);
  33939.             } else {
  33940.                 writeField("journal", item.publicationTitle);
  33941.             }
  33942.         }
  33943.         
  33944.         if(item.publisher) {
  33945.             if(item.itemType == "thesis") {
  33946.                 writeField("school", item.publisher);
  33947.             } else if(item.itemType =="report") {
  33948.                 writeField("institution", item.publisher);
  33949.             } else {
  33950.                 writeField("publisher", item.publisher);
  33951.             }
  33952.         }
  33953.         
  33954.         if(item.creators && item.creators.length) {
  33955.             // split creators into subcategories
  33956.             var author = "";
  33957.             var editor = "";
  33958.             for each(var creator in item.creators) {
  33959.                 var creatorString = creator.lastName;
  33960.  
  33961.                 if (creator.firstName) {
  33962.                     creatorString = creator.firstName + " " + creator.lastName;
  33963.                 }
  33964.  
  33965.                 if (creator.creatorType == "editor") {
  33966.                     editor += " and "+creatorString;
  33967.                 } else {
  33968.                     author += " and "+creatorString;
  33969.                 }
  33970.             }
  33971.             
  33972.             if(author) {
  33973.                 writeField("author", author.substr(5));
  33974.             }
  33975.             if(editor) {
  33976.                 writeField("editor", editor.substr(5));
  33977.             }
  33978.         }
  33979.         
  33980.         if(item.date) {
  33981.             var date = Zotero.Utilities.strToDate(item.date);
  33982.             // need to use non-localized abbreviation
  33983.             if(date.month) {
  33984.                 writeField("month", months[date.month], true);
  33985.             }
  33986.             if(date.year) {
  33987.                 writeField("year", date.year);
  33988.             }
  33989.         }
  33990.         
  33991.         if(item.extra) {
  33992.             writeField("note", item.extra);
  33993.         }
  33994.         
  33995.         if(item.tags && item.tags.length) {
  33996.             var tagString = "";
  33997.             for each(var tag in item.tags) {
  33998.                 tagString += ","+tag.tag;
  33999.             }
  34000.             writeField("keywords", tagString.substr(1));
  34001.         }
  34002.         
  34003.         if(item.pages) {
  34004.             writeField("pages", item.pages.replace("-","--"));
  34005.         }
  34006.         
  34007.         if(item.itemType == "webpage") {
  34008.             writeField("howpublished", item.url);
  34009.         }
  34010.         if (item.notes) {
  34011.             for each (var note in item.notes) {
  34012.                 writeField("comment", note["note"]);
  34013.             }
  34014.         }        
  34015.         Zotero.write("\n}");
  34016.     }
  34017. }');
  34018.  
  34019.  
  34020. REPLACE INTO translators VALUES ('a6ee60df-1ddc-4aae-bb25-45e0537be973', '1.0.0b3.r1', '', '2008-06-29 21:10:00', '1', '100', '1', 'MARC', 'Simon Kornblith', 'marc', 
  34021. 'function detectImport() {
  34022.     var marcRecordRegexp = /^[0-9]{5}[a-z ]{3}$/
  34023.     var read = Zotero.read(8);
  34024.     if(marcRecordRegexp.test(read)) {
  34025.         return true;
  34026.     }
  34027. }', 
  34028. 'var fieldTerminator = "\x1E";
  34029. var recordTerminator = "\x1D";
  34030. var subfieldDelimiter = "\x1F";
  34031.  
  34032. /*
  34033.  * CLEANING FUNCTIONS
  34034.  */
  34035.  
  34036.  
  34037.  
  34038.  
  34039. // general purpose cleaning
  34040. function clean(value) {
  34041.     value = value.replace(/^[\s\.\,\/\:;]+/, '''');
  34042.     value = value.replace(/[\s\.\,\/\:;]+$/, '''');
  34043.     value = value.replace(/ +/g, '' '');
  34044.     
  34045.     var char1 = value[0];
  34046.     var char2 = value[value.length-1];
  34047.     if((char1 == "[" && char2 == "]") || (char1 == "(" && char2 == ")")) {
  34048.         // chop of extraneous characters
  34049.         return value.substr(1, value.length-2);
  34050.     }
  34051.     
  34052.     return value;
  34053. }
  34054.  
  34055. // number extraction
  34056. function pullNumber(text) {
  34057.     var pullRe = /[0-9]+/;
  34058.     var m = pullRe.exec(text);
  34059.     if(m) {
  34060.         return m[0];
  34061.     }
  34062. }
  34063.  
  34064. // ISBN extraction
  34065. function pullISBN(text) {
  34066.     var pullRe = /[0-9X\-]+/;
  34067.     var m = pullRe.exec(text);
  34068.     if(m) {
  34069.         return m[0];
  34070.     }
  34071. }
  34072.  
  34073. // corporate author extraction
  34074. function corpAuthor(author) {
  34075.     return {lastName:author, fieldMode:true};
  34076. }
  34077.  
  34078. // regular author extraction
  34079. function author(author, type, useComma) {
  34080.     return Zotero.Utilities.cleanAuthor(author, type, useComma);
  34081. }
  34082.  
  34083. /*
  34084.  * END CLEANING FUNCTIONS
  34085.  */
  34086.  
  34087. var record = function() {
  34088.     this.directory = new Object();
  34089.     this.leader = "";
  34090.     this.content = "";
  34091.     
  34092.     // defaults
  34093.     this.indicatorLength = 2;
  34094.     this.subfieldCodeLength = 2;
  34095. }
  34096.  
  34097. // import a binary MARC record into this record
  34098. record.prototype.importBinary = function(record) {
  34099.     // get directory and leader
  34100.     var directory = record.substr(0, record.indexOf(fieldTerminator));
  34101.     this.leader = directory.substr(0, 24);
  34102.     var directory = directory.substr(24);
  34103.     
  34104.     // get various data
  34105.     this.indicatorLength = parseInt(this.leader[10], 10);
  34106.     this.subfieldCodeLength = parseInt(this.leader[11], 10);
  34107.     var baseAddress = parseInt(this.leader.substr(12, 5), 10);
  34108.     
  34109.     // get record data
  34110.     var contentTmp = record.substr(baseAddress);
  34111.     
  34112.     // MARC wants one-byte characters, so when we have multi-byte UTF-8
  34113.     // sequences, add null characters so that the directory shows up right. we
  34114.     // can strip the nulls later.
  34115.     this.content = "";
  34116.     for(i=0; i<contentTmp.length; i++) {
  34117.         this.content += contentTmp[i];
  34118.         if(contentTmp.charCodeAt(i) > 0x00FFFF) {
  34119.             this.content += "\x00\x00\x00";
  34120.         } else if(contentTmp.charCodeAt(i) > 0x0007FF) {
  34121.             this.content += "\x00\x00";
  34122.         } else if(contentTmp.charCodeAt(i) > 0x00007F) {
  34123.             this.content += "\x00";
  34124.         }
  34125.     }
  34126.     
  34127.     // read directory
  34128.     for(var i=0; i<directory.length; i+=12) {
  34129.         var tag = parseInt(directory.substr(i, 3), 10);
  34130.         var fieldLength = parseInt(directory.substr(i+3, 4), 10);
  34131.         var fieldPosition = parseInt(directory.substr(i+7, 5), 10);
  34132.         
  34133.         if(!this.directory[tag]) {
  34134.             this.directory[tag] = new Array();
  34135.         }
  34136.         this.directory[tag].push([fieldPosition, fieldLength]);
  34137.     }
  34138. }
  34139.  
  34140. // add a field to this record
  34141. record.prototype.addField = function(field, indicator, value) {
  34142.     field = parseInt(field, 10);
  34143.     // make sure indicator is the right length
  34144.     if(indicator.length > this.indicatorLength) {
  34145.         indicator = indicator.substr(0, this.indicatorLength);
  34146.     } else if(indicator.length != this.indicatorLength) {
  34147.         indicator = Zotero.Utilities.lpad(indicator, " ", this.indicatorLength);
  34148.     }
  34149.     
  34150.     // add terminator
  34151.     value = indicator+value+fieldTerminator;
  34152.     
  34153.     // add field to directory
  34154.     if(!this.directory[field]) {
  34155.         this.directory[field] = new Array();
  34156.     }
  34157.     this.directory[field].push([this.content.length, value.length]);
  34158.     
  34159.     // add field to record
  34160.     this.content += value;
  34161. }
  34162.  
  34163. // get all fields with a certain field number
  34164. record.prototype.getField = function(field) {
  34165.     field = parseInt(field, 10);
  34166.     var fields = new Array();
  34167.     
  34168.     // make sure fields exist
  34169.     if(!this.directory[field]) {
  34170.         return fields;
  34171.     }
  34172.     
  34173.     // get fields
  34174.     for(var i in this.directory[field]) {
  34175.         var location = this.directory[field][i];
  34176.         
  34177.         // add to array, replacing null characters
  34178.         fields.push([this.content.substr(location[0], this.indicatorLength),
  34179.                      this.content.substr(location[0]+this.indicatorLength,
  34180.                        location[1]-this.indicatorLength-1).replace(/\x00/g, "")]);
  34181.     }
  34182.     
  34183.     return fields;
  34184. }
  34185.  
  34186. // get subfields from a field
  34187. record.prototype.getFieldSubfields = function(tag) { // returns a two-dimensional array of values
  34188.     var fields = this.getField(tag);
  34189.     var returnFields = new Array();
  34190.     
  34191.     for(var i in fields) {
  34192.         returnFields[i] = new Object();
  34193.         
  34194.         var subfields = fields[i][1].split(subfieldDelimiter);
  34195.         if (subfields.length == 1) {
  34196.             returnFields[i]["?"] = fields[i][1];
  34197.         } else {
  34198.             for(var j in subfields) {
  34199.                 if(subfields[j]) {
  34200.                     var subfieldIndex = subfields[j].substr(0, this.subfieldCodeLength-1);
  34201.                     if(!returnFields[i][subfieldIndex]) {
  34202.                         returnFields[i][subfieldIndex] = subfields[j].substr(this.subfieldCodeLength-1);
  34203.                     }
  34204.                 }
  34205.             }
  34206.         }
  34207.     }
  34208.     
  34209.     return returnFields;
  34210. }
  34211.  
  34212. // add field to DB
  34213. record.prototype._associateDBField = function(item, fieldNo, part, fieldName, execMe, arg1, arg2) {
  34214.     var field = this.getFieldSubfields(fieldNo);
  34215.     
  34216.     Zotero.debug(''MARC: found ''+field.length+'' matches for ''+fieldNo+part);
  34217.     if(field) {
  34218.         for(var i in field) {
  34219.             var value = false;
  34220.             for(var j=0; j<part.length; j++) {
  34221.                 var myPart = part[j];
  34222.                 if(field[i][myPart]) {
  34223.                     if(value) {
  34224.                         value += " "+field[i][myPart];
  34225.                     } else {
  34226.                         value = field[i][myPart];
  34227.                     }
  34228.                 }
  34229.             }
  34230.             if(value) {
  34231.                 value = clean(value);
  34232.                 
  34233.                 if(execMe) {
  34234.                     value = execMe(value, arg1, arg2);
  34235.                 }
  34236.                 
  34237.                 if(fieldName == "creator") {
  34238.                     item.creators.push(value);
  34239.                 } else {
  34240.                     item[fieldName] = value;
  34241.                     return;
  34242.                 }
  34243.             }
  34244.         }
  34245.     }
  34246. }
  34247.  
  34248. // add field to DB as tags
  34249. record.prototype._associateTags = function(item, fieldNo, part) {
  34250.     var field = this.getFieldSubfields(fieldNo);
  34251.     
  34252.     for(var i in field) {
  34253.         for(var j=0; j<part.length; j++) {
  34254.             var myPart = part[j];
  34255.             if(field[i][myPart]) {
  34256.                 item.tags.push(clean(field[i][myPart]));
  34257.             }
  34258.         }
  34259.     }
  34260. }
  34261.  
  34262. // this function loads a MARC record into our database
  34263. record.prototype.translate = function(item) {
  34264.     // get item type
  34265.     if(this.leader) {
  34266.         var marcType = this.leader[6];
  34267.         if(marcType == "g") {
  34268.             item.itemType = "film";
  34269.         } else if(marcType == "k" || marcType == "e" || marcType == "f") {
  34270.             item.itemType = "artwork";
  34271.         } else if(marcType == "t") {
  34272.             item.itemType = "manuscript";
  34273.         } else {
  34274.             item.itemType = "book";
  34275.         }
  34276.     } else {
  34277.         item.itemType = "book";
  34278.     }
  34279.     
  34280.     // Extract ISBNs
  34281.     this._associateDBField(item, "020", "a", "ISBN", pullISBN);
  34282.     // Extract ISSNs
  34283.     this._associateDBField(item, "022", "a", "ISSN", pullISBN);
  34284.     // Extract creators
  34285.     this._associateDBField(item, "100", "a", "creator", author, "author", true);
  34286.     this._associateDBField(item, "110", "a", "creator", corpAuthor, "author");
  34287.     this._associateDBField(item, "111", "a", "creator", corpAuthor, "author");
  34288.     this._associateDBField(item, "700", "a", "creator", author, "contributor", true);
  34289.     this._associateDBField(item, "710", "a", "creator", corpAuthor, "contributor");
  34290.     this._associateDBField(item, "711", "a", "creator", corpAuthor, "contributor");
  34291.     if(item.itemType == "book" && !item.creators.length) {
  34292.         // some LOC entries have no listed author, but have the author in the person subject field as the first entry
  34293.         var field = this.getFieldSubfields("600");
  34294.         if(field[0]) {
  34295.             item.creators.push(Zotero.Utilities.cleanAuthor(field[0]["a"], "author", true));    
  34296.         }
  34297.     }
  34298.     
  34299.     // Extract tags
  34300.     // personal
  34301.     this._associateTags(item, "600", "aqtxyz");
  34302.     // corporate
  34303.     this._associateTags(item, "611", "abtxyz");
  34304.     // meeting
  34305.     this._associateTags(item, "630", "acetxyz");
  34306.     // uniform title
  34307.     this._associateTags(item, "648", "atxyz");
  34308.     // chronological
  34309.     this._associateTags(item, "650", "axyz");
  34310.     // topical
  34311.     this._associateTags(item, "651", "abcxyz");
  34312.     // geographic
  34313.     this._associateTags(item, "653", "axyz");
  34314.     // uncontrolled
  34315.     this._associateTags(item, "653", "a");
  34316.     // faceted topical term (whatever that means)
  34317.     this._associateTags(item, "654", "abcyz");
  34318.     // genre/form
  34319.     this._associateTags(item, "655", "abcxyz");
  34320.     // occupation
  34321.     this._associateTags(item, "656", "axyz");
  34322.     // function
  34323.     this._associateTags(item, "657", "axyz");
  34324.     // curriculum objective
  34325.     this._associateTags(item, "658", "ab");
  34326.     // hierarchical geographic place name
  34327.     this._associateTags(item, "662", "abcdfgh");
  34328.     
  34329.     // Extract title
  34330.     this._associateDBField(item, "245", "ab", "title");
  34331.     // Extract edition
  34332.     this._associateDBField(item, "250", "a", "edition");
  34333.     // Extract place info
  34334.     this._associateDBField(item, "260", "a", "place");
  34335.     
  34336.     // Extract publisher/distributor
  34337.     if(item.itemType == "film") {
  34338.         this._associateDBField(item, "260", "b", "distributor");
  34339.     } else {
  34340.         this._associateDBField(item, "260", "b", "publisher");
  34341.     }
  34342.     
  34343.     // Extract year
  34344.     this._associateDBField(item, "260", "c", "date", pullNumber);
  34345.     // Extract pages
  34346.     this._associateDBField(item, "300", "a", "pages", pullNumber);
  34347.     // Extract series
  34348.     this._associateDBField(item, "440", "a", "series");
  34349.     // Extract series number
  34350.     this._associateDBField(item, "440", "v", "seriesNumber");
  34351.     // Extract call number
  34352.     this._associateDBField(item, "084", "ab", "callNumber");
  34353.     this._associateDBField(item, "082", "a", "callNumber");
  34354.     this._associateDBField(item, "080", "ab", "callNumber");
  34355.     this._associateDBField(item, "070", "ab", "callNumber");
  34356.     this._associateDBField(item, "060", "ab", "callNumber");
  34357.     this._associateDBField(item, "050", "ab", "callNumber");
  34358.     this._associateDBField(item, "090", "a", "callNumber");
  34359.     this._associateDBField(item, "099", "a", "callNumber");
  34360.     this._associateDBField(item, "955", "a", "callNumber");
  34361.     
  34362.     //German
  34363.     if (!item.place) this._associateDBField(item, "410", "a", "place");
  34364.     if (!item.publisher) this._associateDBField(item, "412", "a", "publisher");
  34365.     if (!item.title) this._associateDBField(item, "331", "a", "title");
  34366.     if (!item.title) this._associateDBField(item, "1300", "a", "title");
  34367.     if (!item.date) this._associateDBField(item, "425", "a", "date", pullNumber);
  34368.     if (!item.date) this._associateDBField(item, "595", "a", "date", pullNumber);
  34369.     if (this.getFieldSubfields("104")[0]) this._associateDBField(item, "104", "a", "creator", author, "author", true);
  34370.     if (this.getFieldSubfields("800")[0]) this._associateDBField(item, "800", "a", "creator", author, "author", true);
  34371.     
  34372.     //Spanish
  34373.     if (!item.title) this._associateDBField(item, "200", "a", "title");
  34374.     if (!item.place) this._associateDBField(item, "210", "a", "place");
  34375.     if (!item.publisher) this._associateDBField(item, "210", "c", "publisher");
  34376.     if (!item.date) this._associateDBField(item, "210", "d", "date");
  34377.     if (!item.creators) {
  34378.         for (var i = 700; i < 703; i++) {
  34379.             if (this.getFieldSubfields(i)[0]) {
  34380.                 Zotero.debug(i + " is AOK");
  34381.                 Zotero.debug(this.getFieldSubfields(i.toString()));
  34382.                 var aut = this.getFieldSubfields(i)[0];
  34383.                 if (aut.b) {
  34384.                     aut = aut[''b''].replace(/,\W+/g, "") + " " + aut[''a''].replace(/,\s/g, "");
  34385.                 } else {
  34386.                     aut = aut[''a''].split(", ").join(" ");
  34387.                 }
  34388.                 item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author"));
  34389.             }
  34390.         }
  34391.     }
  34392.     if(item.title) {
  34393.         item.title = Zotero.Utilities.capitalizeTitle(item.title);
  34394.     }
  34395.     if (this.getFieldSubfields("335")[0]) {
  34396.         item.title = item.title + ": " + this.getFieldSubfields("335")[0][''a''];
  34397.     }    
  34398. }
  34399.  
  34400. function doImport() {
  34401.     var text;
  34402.     var holdOver = "";    // part of the text held over from the last loop
  34403.     
  34404.     while(text = Zotero.read(4096)) {    // read in 4096 byte increments
  34405.         var records = text.split("\x1D");
  34406.         
  34407.         if(records.length > 1) {
  34408.             records[0] = holdOver + records[0];
  34409.             holdOver = records.pop(); // skip last record, since it''s not done
  34410.             
  34411.             for(var i in records) {
  34412.                 var newItem = new Zotero.Item();
  34413.                 
  34414.                 // create new record
  34415.                 var rec = new record();    
  34416.                 rec.importBinary(records[i]);
  34417.                 rec.translate(newItem);
  34418.                 
  34419.                 newItem.complete();
  34420.             }
  34421.         } else {
  34422.             holdOver += text;
  34423.         }
  34424.     }
  34425. }');
  34426.  
  34427. REPLACE INTO translators VALUES ('3f50aaac-7acc-4350-acd0-59cb77faf620', '1.0.0b4.r1', '', '2008-07-17 22:05:00', '1', '100', '2', 'Wikipedia Citation Templates', 'Simon Kornblith', '',
  34428. 'Zotero.addOption("exportCharset", "UTF-8");',
  34429. 'var fieldMap = {
  34430.     edition:"edition",
  34431.     publisher:"publisher",
  34432.     doi:"DOI",
  34433.     isbn:"ISBN",
  34434.     issn:"ISSN",
  34435.     conference:"conferenceName",
  34436.     volume:"volume",
  34437.     issue:"issue",
  34438.     pages:"pages",
  34439.     number:"episodeNumber"
  34440. };
  34441.  
  34442. var typeMap = {
  34443.     book:"Cite book",
  34444.     bookSection:"Cite book",
  34445.     journalArticle:"Cite journal",
  34446.     magazineArticle:"Cite news",
  34447.     newspaperArticle:"Cite news",
  34448.     thesis:"Cite paper",
  34449.     letter:"Cite",
  34450.     manuscript:"Cite book",
  34451.     interview:"Cite interview",
  34452.     film:"Cite video",
  34453.     artwork:"Cite",
  34454.     webpage:"Cite web",
  34455.     report:"Cite conference",
  34456.     bill:"Cite",
  34457.     hearing:"Cite",
  34458.     patent:"Cite",
  34459.     statute:"Cite",
  34460.     email:"Cite email",
  34461.     map:"Cite",
  34462.     blogPost:"Cite web",
  34463.     instantMessage:"Cite",
  34464.     forumPost:"Cite web",
  34465.     audioRecording:"Cite",
  34466.     presentation:"Cite paper",
  34467.     videoRecording:"Cite video",
  34468.     tvBroadcast:"Cite episode",
  34469.     radioBroadcast:"Cite episode",
  34470.     podcast:"Cite podcast",
  34471.     computerProgram:"Cite",
  34472.     conferencePaper:"Cite conference",
  34473.     document:"Cite",
  34474.     encyclopediaArticle:"Cite encyclopedia",
  34475.     dictionaryEntry:"Cite encyclopedia"
  34476. };
  34477.  
  34478. function formatAuthors(authors, useTypes) {
  34479.     var text = "";
  34480.     for each(var author in authors) {
  34481.         text += ", "+author.firstName;
  34482.         if(author.firstName && author.lastName) text += " ";
  34483.         text += author.lastName;
  34484.         if(useTypes) text += " ("+Zotero.Utilities.getLocalizedCreatorType(author.creatorType)+")";
  34485.     }
  34486.     return text.substr(2);
  34487. }
  34488.  
  34489. function formatFirstAuthor(authors, useTypes) {    
  34490.     var firstCreator = authors.shift();
  34491.     var field = firstCreator.lastName;
  34492.     if(firstCreator.lastName && firstCreator.firstName) field += ", ";
  34493.     field += firstCreator.firstName;
  34494.     if(useTypes) field += " ("+Zotero.Utilities.getLocalizedCreatorType(firstCreator.creatorType)+")";
  34495.     return field;
  34496. }
  34497.  
  34498. function formatDate(date) {
  34499.     var date = date.substr(0, date.indexOf(" "));
  34500.     if(date.substr(4, 3) == "-00") {
  34501.         date = date.substr(0, 4);
  34502.     } else if(date.substr(7, 3) == "-00") {
  34503.         date = date.substr(0, 7);
  34504.     }
  34505.     return date;
  34506. }
  34507.  
  34508. function doExport() {
  34509.     var first = true;
  34510.     while(item = Zotero.nextItem()) {
  34511.         // determine type
  34512.         var type = typeMap[item.itemType];
  34513.         if(!type) type = "Cite";
  34514.         
  34515.         var properties = new Object();
  34516.         
  34517.         for(var wikiField in fieldMap) {
  34518.             var zoteroField = fieldMap[wikiField];
  34519.             if(item[zoteroField]) properties[wikiField] = item[zoteroField];
  34520.         }
  34521.         
  34522.         if(item.creators && item.creators.length) {
  34523.             if(type == "Cite episode") {
  34524.                 // now add additional creators
  34525.                 properties.credits = formatAuthors(item.creators, true);
  34526.             } else if(type == "Cite video") {
  34527.                 properties.people = "";
  34528.                 
  34529.                 // make first creator first, last
  34530.                 properties.people = formatFirstAuthor(item.creators, true);
  34531.                 // now add additional creators
  34532.                 if(item.creators.length) properties.people += ", "+formatAuthors(item.creators, true);
  34533.                 
  34534.                 // use type
  34535.                 if(item.type) {
  34536.                     properties.medium = item.type;
  34537.                 }
  34538.             } else if(type == "Cite email") {
  34539.                 // get rid of non-authors
  34540.                 for(var i in item.creators) {
  34541.                     if(item.creators[i].creatorType != "author") {
  34542.                         // drop contributors
  34543.                         item.creators.splice(i, 1);
  34544.                     }
  34545.                 }
  34546.                 
  34547.                 // make first authors first, last
  34548.                 properties.author = formatFirstAuthor(item.creators);
  34549.                 // add supplemental authors
  34550.                 if(item.creators.length) {
  34551.                     properties.author += ", "+formatAuthors(item.creators);
  34552.                 }
  34553.             } else if(type == "Cite interview") {
  34554.                 // check for an interviewer or translator
  34555.                 var interviewers = [];
  34556.                 var translators = [];
  34557.                 for(var i in item.creators) {
  34558.                     if(item.creators[i].creatorType == "translator") {
  34559.                         translators = translators.concat(item.creators.splice(i, 1));
  34560.                     } else if(item.creators[i].creatorType == "interviewer") {
  34561.                         interviewers = interviewers.concat(item.creators.splice(i, 1));
  34562.                     } else if(item.creators[i].creatorType == "contributor") {
  34563.                         // drop contributors
  34564.                         item.creators.splice(i, 1);
  34565.                     }
  34566.                 }
  34567.                 
  34568.                 // interviewers
  34569.                 if(interviewers.length) {
  34570.                     properties.interviewer = formatAuthors([interviewers.shift()]);
  34571.                     if(interviewers.length) properties.cointerviewers = formatAuthors(interviewers);
  34572.                 }
  34573.                 // translators
  34574.                 if(translators.length) {
  34575.                     properties.cointerviewers = (properties.cointerviewers ? properties.cointerviewers+", " : "");
  34576.                     properties.cointerviewers += formatAuthors(translators);
  34577.                 }
  34578.                 // interviewees
  34579.                 if(item.creators.length) {
  34580.                     // take up to 4 interviewees
  34581.                     var i = 1;
  34582.                     while((interviewee = item.creators.shift()) && i <= 4) {
  34583.                         var lastKey = "last";
  34584.                         var firstKey = "first";
  34585.                         if(i != 1) {
  34586.                             lastKey += i;
  34587.                             firstKey += i;
  34588.                         }
  34589.                         
  34590.                         properties[lastKey] = interviewee.lastName;
  34591.                         properties[firstKey] = interviewee.firstName;
  34592.                     }
  34593.                 }
  34594.                 // medium
  34595.                 if(item.medium) {
  34596.                     properties.type = item.medium
  34597.                 }
  34598.             } else {
  34599.                 // check for an editor or translator
  34600.                 var editors = [];
  34601.                 var translators = [];
  34602.                 for(var i in item.creators) {
  34603.                     if(item.creators[i].creatorType == "translator") {
  34604.                         translators = translators.concat(item.creators.splice(i, 1));
  34605.                     } else if(item.creators[i].creatorType == "editor") {
  34606.                         editors = editors.concat(item.creators.splice(i, 1));
  34607.                     } else if(item.creators[i].creatorType == "contributor") {
  34608.                         // drop contributors
  34609.                         item.creators.splice(i, 1);
  34610.                     }
  34611.                 }
  34612.                 
  34613.                 // editors
  34614.                 var others = "";
  34615.                 if(editors.length) {
  34616.                     var editorText = formatAuthors(editors)+(editors.length == 1 ? " (ed.)" : " (eds.)");
  34617.                     if(item.itemType == "bookSection" || type == "Cite conference" || type == "Cite encyclopedia") {
  34618.                         // as per docs, use editor only for chapters
  34619.                         properties.editors = editorText;
  34620.                     } else {
  34621.                         others = editorText;
  34622.                     }
  34623.                 }
  34624.                 // translators
  34625.                 if(translators.length) {
  34626.                     if(others) others += ", ";
  34627.                     others += formatAuthors(translators)+" (trans.)";
  34628.                 }
  34629.                 
  34630.                 // pop off first author, if there is one
  34631.                 if(item.creators.length) {
  34632.                     var firstAuthor = item.creators.shift();
  34633.                     properties.last = firstAuthor.lastName;
  34634.                     properties.first = firstAuthor.firstName;
  34635.                     
  34636.                     // add supplemental authors
  34637.                     if(item.creators.length) {
  34638.                         properties.coauthors = formatAuthors(item.creators);
  34639.                     }
  34640.                 }
  34641.                 
  34642.                 // attach others
  34643.                 if(others) {
  34644.                     if(type == "Cite book") {
  34645.                         properties.others = others;
  34646.                     } else {
  34647.                         properties.coauthors = (properties.coauthors ? properties.coauthors+", " : "");
  34648.                         properties.coauthors += others;
  34649.                     }
  34650.                 }
  34651.             }
  34652.         }
  34653.         
  34654.         if(item.itemType == "bookSection") {
  34655.             properties.title = item.publicationTitle;
  34656.             properties.chapter = item.title;;
  34657.         } else {
  34658.             properties.title = item.title;
  34659.             
  34660.             if(type == "Cite journal") {
  34661.                 properties.journal = item.publicationTitle;
  34662.             } else if(type == "Cite conference") {
  34663.                 properties.booktitle = item.publicationTitle;
  34664.             } else if(type == "Cite encyclopedia") {
  34665.                 properties.encyclopedia = item.publicationTitle;
  34666.             } else {
  34667.                 properties.work = item.publicationTitle;
  34668.             }
  34669.         }
  34670.         
  34671.         if(type == "Cite web" && item.type) {
  34672.             properties.format = item.type;
  34673.         }
  34674.         
  34675.         if(item.place) {
  34676.             if(type == "Cite episode") {
  34677.                 properties.city = item.place;
  34678.             } else {
  34679.                 properties.location = item.place;
  34680.             }
  34681.         }
  34682.         
  34683.         if(item.series) {
  34684.             properties.series = item.series;
  34685.         } else if(item.seriesTitle) {
  34686.             properties.series = item.seriesTitle;
  34687.         } else if(item.seriesText) {
  34688.             properties.series = item.seriesText;
  34689.         }
  34690.         
  34691.         if(item.accessDate) {
  34692.             properties.accessdate = formatDate(item.accessDate);
  34693.         }
  34694.         
  34695.         if(item.date) {
  34696.             if(type == "Cite email") {
  34697.                 properties.senddate = formatDate(item.date);
  34698.             } else {
  34699.                 var date = Zotero.Utilities.strToDate(item.date);
  34700.                 var mm = "00";
  34701.                 var dd = "00";
  34702.                 if (date["month"] != undefined){
  34703.                     mm = date["month"];
  34704.                     mm = mm + 1;
  34705.                     if (mm < 10){
  34706.                         mm = "0" + mm;
  34707.                     } 
  34708.                 }
  34709.                 if (date["day"] != undefined){
  34710.                     dd = date["day"];
  34711.                     if (dd < 10){
  34712.                         dd = "0" + dd;
  34713.                     } 
  34714.                 }
  34715.                 if (date["year"] != undefined){
  34716.                     var yyyy = date["year"].toString();
  34717.                     while (yyyy.length < 4){
  34718.                         yyyy = "0"+yyyy;
  34719.                     }
  34720.                     properties.date = formatDate(yyyy+"-"+mm+"-"+dd+" ");
  34721.                 }
  34722.             }
  34723.         }
  34724.         
  34725.         if(item.runningTime) {
  34726.             if(type == "Cite episode") {
  34727.                 properties.minutes = item.runningTime;
  34728.             } else {
  34729.                 properties.time = item.runningTime;
  34730.             }
  34731.         }
  34732.         
  34733.         if(item.url && item.accessDate) {
  34734.             if(item.itemType == "bookSection") {
  34735.                 properties.chapterurl = item.url;
  34736.             } else {
  34737.                 properties.url = item.url;
  34738.             }
  34739.         }
  34740.         
  34741.         // write out properties
  34742.         Zotero.write((first ? "" : "\r\n\r\n") + "{{"+type);
  34743.         for(var key in properties) {
  34744.             if(properties[key]) Zotero.write("\r\n| "+key+" = "+properties[key]);
  34745.         }
  34746.         Zotero.write("\r\n}}");
  34747.         
  34748.         first = false;
  34749.     }
  34750. }');
  34751.  
  34752.  
  34753. REPLACE INTO translators VALUES ('c82c574d-7fe8-49ca-a360-a05d6e34fec0', '1.0', '', '2009-03-10 05:35:00', 1, 100, 4, 'zotero.org', 'Dan Stillman', '^http://[^/]*zotero\.org/[^/]+/[0-9]+/(items(/?[0-9]+?)?|items/collection/[0-9]+)(\?.*)?$',
  34754. 'function detectWeb(doc, url) {
  34755.     var namespace = doc.documentElement.namespaceURI;
  34756.     var nsResolver = namespace ? function(prefix) {
  34757.             if (prefix == ''x'') return namespace; else return null;
  34758.         } : null;
  34759.     var a = doc.evaluate(''//div[@id="login-links"]/a[text()="My Library"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  34760.     // Skip current user''s library
  34761.     if (a && url.indexOf(a.href.match(/(^.+)\/items/)[1]) == 0) {
  34762.         return false;
  34763.     }
  34764.     // Library and collections
  34765.     if (url.match(/\/items\/?(\?.*)?$/) || url.match(/\/items\/collection\/[0-9]+(\?.*)?$/)) {
  34766.         if (!doc.getElementById("field-table")) {
  34767.             return false;
  34768.         }
  34769.         return "multiple";
  34770.     }
  34771.     // Individual item
  34772.     else if (url.match(/\/items\/[0-9]+(\?.*)?$/)) {
  34773.         // TODO: embed in page, because this is absurd
  34774.         var typeMap = {
  34775.             "Note": "note",
  34776.             "Attachment": "attachment",
  34777.             "Book": "book",
  34778.             "Book Section": "bookSection",
  34779.             "Journal Article": "journalArticle",
  34780.             "Magazine Article": "magazineArticle",
  34781.             "Newspaper Article": "newspaperArticle",
  34782.             "Thesis": "thesis",
  34783.             "Letter": "letter",
  34784.             "Manuscript": "manuscript",
  34785.             "Interview": "interview",
  34786.             "Film": "film",
  34787.             "Artwork": "artwork",
  34788.             "Web Page": "webpage",
  34789.             "Report": "report",
  34790.             "Bill": "bill",
  34791.             "Case": "case",
  34792.             "Hearing": "hearing",
  34793.             "Patent": "patent",
  34794.             "Statute": "statute",
  34795.             "E-mail": "email",
  34796.             "Map": "map",
  34797.             "Blog Post": "blogPost",
  34798.             "Instant Message": "instantMessage",
  34799.             "Forum Post": "forumPost",
  34800.             "Audio Recording": "audioRecording",
  34801.             "Presentation": "presentation",
  34802.             "Video Recording": "videoRecording",
  34803.             "TV Broadcast": "tvBroadcast",
  34804.             "Radio Broadcast": "radioBroadcast",
  34805.             "Podcast": "podcast",
  34806.             "Computer Program": "computerProgram",
  34807.             "Conference Paper": "conferencePaper",
  34808.             "Document": "document",
  34809.             "Encyclopedia Article":"encyclopediaArticle",
  34810.             "Dictionary Entry": "dictionaryEntry"
  34811.         };
  34812.         var td = doc.evaluate(''//div[@id="content"]/div[@class="major-col"]/table//tr[th[text()="Item Type"]]/td'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  34813.         return td ? typeMap[td.textContent] : "book";
  34814.     }
  34815. }',
  34816.  
  34817. 'function xmlToItem(xmlItem) {
  34818.     // "with ({});" needed to fix default namespace scope issue
  34819.     // See https://bugzilla.mozilla.org/show_bug.cgi?id=330572
  34820.     default xml namespace = ''http://zotero.org/namespaces/transfer''; with ({});
  34821.     var itemType = xmlItem.@itemType;
  34822.     
  34823.     // FIXME: translate.js only allow top-level attachments in import mode
  34824.     if (itemType == ''attachment'') {
  34825.         itemType = ''document'';
  34826.     }
  34827.     
  34828.     var newItem = new Zotero.Item(itemType);
  34829.     
  34830.     // Don''t auto-set repository
  34831.     newItem.repository = false;
  34832.     
  34833.     for each(var field in xmlItem.field) {
  34834.         var fieldName = field.@name.toString();
  34835.         newItem[fieldName] = field.toString();
  34836.     }
  34837.     
  34838.     // Item creators
  34839.     for each(var creator in xmlItem.creator) {
  34840.         var data = {
  34841.             creatorType: creator.@creatorType
  34842.         };
  34843.         if (creator.creator.fieldMode == 1) {
  34844.             data.fieldMode = 1;
  34845.             data.lastName = creator.creator.name.toString();
  34846.         }
  34847.         else {
  34848.             data.firstName = creator.creator.firstName.toString();
  34849.             data.lastName = creator.creator.lastName.toString();
  34850.         }
  34851.         newItem.creators.push(data);
  34852.     }
  34853.     
  34854.     // Both notes and attachments might have parents and notes
  34855.     if (itemType == ''note'' || itemType == ''attachment'') {
  34856.         newItem.note = xmlItem.note.toString();
  34857.     }
  34858.     
  34859.     // Attachment metadata
  34860.     if (itemType == ''attachment'') {
  34861.         //newItem.attachmentLinkMode = parseInt(xmlItem.@linkMode);
  34862.         newItem.mimeType = xmlItem.@mimeType.toString();
  34863.         newItem.charset = xmlItem.@charset.toString();
  34864.         var path = xmlItem.path.toString();
  34865.         if (path) { 
  34866.             newItem.path = path;
  34867.         }
  34868.     }
  34869.     
  34870.     newItem.complete();
  34871.  
  34872. }
  34873.  
  34874. function doWeb(doc, url) {
  34875.     var userID = url.match(/^http:\/\/[^\/]*zotero\.org\/[^\/]+\/([0-9]+)/)[1];
  34876.     var apiPrefix = "https://api.zotero.org/users/" + userID + "/";
  34877.     var itemRe = /^http:\/\/[^\/]*zotero\.org\/[^\/]+\/[0-9]+\/items\/([0-9]+)/;
  34878.     var nsAtom = new Namespace(''http://www.w3.org/2005/Atom'');
  34879.     var nsZXfer = new Namespace(''http://zotero.org/namespaces/transfer'');
  34880.     
  34881.     if (detectWeb(doc, url) == "multiple") {
  34882.         var namespace = doc.documentElement.namespaceURI;
  34883.         var nsResolver = namespace ? function(prefix) {
  34884.                 if (prefix == ''x'') return namespace; else return null;
  34885.             } : null;
  34886.         var column = doc.evaluate(''//table[@id="field-table"]//td[1][@class="title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  34887.         var elems = [], td;
  34888.         while (td = column.iterateNext()) {
  34889.             elems.push(td);
  34890.         }
  34891.         var items = Zotero.Utilities.getItemArray(doc, elems);
  34892.         
  34893.         items = Zotero.selectItems(items);
  34894.         if (!items) {
  34895.             return true;
  34896.         }
  34897.         
  34898.         var apiURLs = [], itemID, apiURL;
  34899.         for (var url in items) {
  34900.             itemID = url.match(itemRe)[1];
  34901.             apiURL = apiPrefix + "items/" + itemID + "?content=full";
  34902.             apiURLs.push(apiURL);
  34903.         }
  34904.         
  34905.         Zotero.Utilities.HTTP.doGet(apiURLs, function(text) {
  34906.             // Strip XML declaration and convert to E4X
  34907.             var entry = new XML(text.replace(/<\?xml.*\?>/, ''''));
  34908.             xmlToItem(entry.nsAtom::content.nsZXfer::item);
  34909.         }, function () { Zotero.done(); });
  34910.     }
  34911.     else {
  34912.         var itemID = url.match(itemRe)[1];
  34913.         var apiURL = apiPrefix + "items/" + itemID + "?content=full";
  34914.         Zotero.Utilities.doGet(apiURL, function (text) {
  34915.             // Strip XML declaration and convert to E4X
  34916.             var entry = new XML(text.replace(/<\?xml.*\?>/, ''''));
  34917.             xmlToItem(entry.nsAtom::content.nsZXfer::item);
  34918.             Zotero.done();
  34919.         });
  34920.     }
  34921.     Zotero.wait();
  34922. }');
  34923.  
  34924.  
  34925.  
  34926. -- ----------------------------------------------------------------
  34927. --
  34928. --  CSL styles
  34929. --
  34930. -- ----------------------------------------------------------------
  34931. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/ama', '2008-05-08 19:00:00', 'American Medical Association',
  34932. '<?xml version="1.0" encoding="UTF-8"?>
  34933. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  34934.   <info>
  34935.     <title>American Medical Association</title>
  34936.     <id>http://www.zotero.org/styles/ama</id>
  34937.     <link href="http://www.zotero.org/styles/ama"/>
  34938.     <author>
  34939.       <name>Julian Onions</name>
  34940.       <email>julian.onions@gmail.com</email>
  34941.     </author>
  34942.     <category term="numeric"/>
  34943.     <category term="medicine"/>
  34944.     <updated>2008-05-08T19:00:00+00:00</updated>
  34945.     <summary>The American Medical Association style as used in JAMA.</summary>
  34946.     <link href="http://www.samford.edu/schools/pharmacy/dic/amaquickref07.pdf" rel="documentation"/>
  34947.   </info>
  34948.   <macro name="editor">
  34949.     <names variable="editor">
  34950.       <name name-as-sort-order="all" sort-separator=" " initialize-with="" delimiter=", " delimiter-precedes-last="always"/>
  34951.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  34952.     </names>
  34953.   </macro>
  34954.   <macro name="anon">
  34955.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  34956.   </macro>
  34957.   <macro name="author">
  34958.     <group suffix=".">
  34959.       <names variable="author">
  34960.     <name name-as-sort-order="all" sort-separator=" " initialize-with=""
  34961.           delimiter=", " delimiter-precedes-last="always"/>
  34962.     <label form="short" prefix=" " suffix="" text-case="lowercase"/>
  34963.     <substitute>
  34964.       <names variable="editor"/>
  34965.       <text macro="anon"/>
  34966.     </substitute>
  34967.       </names>
  34968.     </group>
  34969.   </macro>
  34970.   <macro name="author-short">
  34971.     <names variable="author">
  34972.       <name form="short" and="symbol" delimiter=", " initialize-with="."/>
  34973.       <substitute>
  34974.     <names variable="editor"/>
  34975.     <names variable="translator"/>
  34976.     <text macro="anon"/>
  34977.       </substitute>
  34978.     </names>
  34979.   </macro>
  34980.   <macro name="access">
  34981.     <group>
  34982.       <text value="Available at:" suffix=" "/>
  34983.       <text variable="URL"/>
  34984.       <group prefix=" [" suffix="]">
  34985.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  34986.     <date variable="accessed">
  34987.       <date-part name="month" suffix=" "/>
  34988.       <date-part name="day" suffix=", "/>
  34989.       <date-part name="year"/>
  34990.     </date>
  34991.       </group>
  34992.     </group>
  34993.   </macro>
  34994.   <macro name="title">
  34995.     <choose>
  34996.       <if type="book">
  34997.     <text variable="title" font-style="italic"/>
  34998.       </if>
  34999.       <else>
  35000.     <text variable="title"/>
  35001.       </else>
  35002.     </choose>
  35003.   </macro>
  35004.   <macro name="publisher">
  35005.     <group delimiter=": ">
  35006.       <text variable="publisher-place"/>
  35007.       <text variable="publisher"/>
  35008.     </group>
  35009.   </macro>
  35010.   <macro name="year-date">
  35011.     <group prefix=" ">
  35012.       <choose>
  35013.     <if variable="issued">
  35014.       <date variable="issued">
  35015.         <date-part name="year"/>
  35016.       </date>
  35017.     </if>
  35018.     <else>
  35019.       <text term="no date"/>
  35020.     </else>
  35021.       </choose>
  35022.     </group>
  35023.   </macro>
  35024.   <macro name="edition">
  35025.     <choose>
  35026.       <if is-numeric="edition">
  35027.     <group delimiter=" ">
  35028.       <number variable="edition" form="ordinal"/>
  35029.       <text term="edition" form="short" suffix="."/>
  35030.     </group>
  35031.       </if>
  35032.       <else>
  35033.       <text variable="edition" suffix="."/>
  35034.       </else>
  35035.     </choose>
  35036.   </macro>
  35037.   <citation>
  35038.     <option name="collapse" value="citation-number"/>
  35039.     <sort>
  35040.       <key variable="citation-number"/>
  35041.     </sort>
  35042.     <layout delimiter="," vertical-align="sup">
  35043.       <text variable="citation-number" />
  35044.       <group prefix="(" suffix=")">
  35045.     <label variable="locator" form="short"/>
  35046.     <text variable="locator"/>
  35047.       </group>
  35048.     </layout>
  35049.   </citation>
  35050.   <bibliography>
  35051.     <option name="hanging-indent" value="false"/>
  35052.     <option name="et-al-min" value="6"/>
  35053.     <option name="et-al-use-first" value="3"/>
  35054.     <layout>
  35055.       <text variable="citation-number" prefix="" suffix=". "/>
  35056.       <text macro="author" suffix=""/>
  35057.       <choose>
  35058.     <if type="book">
  35059.       <group suffix=".">
  35060.         <text macro="title" prefix=" " suffix="."/>
  35061.         <text macro="edition" prefix=" " />
  35062.         <text macro="editor" prefix=" (" suffix=")"/>
  35063.       </group>
  35064.       <text prefix=" " suffix="" macro="publisher"/>
  35065.       <group suffix="." prefix="; ">
  35066.         <date variable="issued">
  35067.           <date-part name="year"/>
  35068.         </date>
  35069.         <text variable="page" prefix=":"/>
  35070.       </group>
  35071.     </if>
  35072.     <else-if type="chapter">
  35073.       <text macro="title" prefix=" " suffix="."/>
  35074.       <group class="container" prefix=" ">
  35075.         <text term="in" text-case="capitalize-first" suffix=": "/>
  35076.         <text macro="editor"/>
  35077.         <text variable="container-title" font-style="italic" prefix=" " suffix="."/>
  35078.         <text variable="volume" prefix="Vol " suffix="."/>
  35079.         <text macro="edition" prefix=" "/>
  35080.         <text variable="collection-title" prefix=" " suffix="."/>
  35081.         <group suffix=".">
  35082.           <text macro="publisher" prefix=" "/>
  35083.           <group suffix="." prefix="; ">
  35084.         <date variable="issued">
  35085.           <date-part name="year"/>
  35086.         </date>
  35087.         <text variable="page" prefix=":"/>
  35088.           </group>
  35089.         </group>
  35090.       </group>
  35091.     </else-if>
  35092.     <else>
  35093.       <group suffix=".">
  35094.         <text macro="title" prefix=" " />
  35095.         <text macro="editor" prefix=" "/>
  35096.       </group>
  35097.       <group class="container" prefix=" " suffix=".">
  35098.         <text variable="container-title" font-style="italic" form="short" suffix="."/>
  35099.         <group delimiter=";" prefix=" ">
  35100.           <date variable="issued">
  35101.         <date-part name="year"/>
  35102.           </date>
  35103.           <group>
  35104.         <text variable="volume" />
  35105.         <text variable="issue" prefix="(" suffix=")"/>
  35106.           </group>
  35107.         </group>
  35108.         <text variable="page" prefix=":"/>
  35109.       </group>
  35110.     </else>
  35111.       </choose>
  35112.       <text prefix=" " macro="access" suffix="."/>
  35113.     </layout>
  35114.   </bibliography>
  35115. </style>
  35116. ');
  35117.  
  35118. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/apa', '2008-11-16 18:00:00', 'American Psychological Association',
  35119. '<?xml version="1.0" encoding="UTF-8"?>
  35120. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  35121. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  35122.   <info>
  35123.     <title>American Psychological Association</title>
  35124.     <id>http://www.zotero.org/styles/apa</id>
  35125.     <link href="http://www.zotero.org/styles/apa"/>
  35126.     <author>
  35127.       <name>Simon Kornblith</name>
  35128.       <email>simon@simonster.com</email>
  35129.     </author>
  35130.     <contributor>
  35131.       <name>Bruce D''Arcus</name>
  35132.     </contributor>
  35133.     <contributor>
  35134.       <name>Curtis M. Humphrey</name>
  35135.     </contributor>
  35136.     <contributor>
  35137.       <name>Richard Karnesky</name>
  35138.       <email>karnesky+zotero@gmail.com</email>
  35139.       <uri>http://arc.nucapt.northwestern.edu/Richard_Karnesky</uri>
  35140.     </contributor>
  35141.     <category term="psychology"/>
  35142.     <category term="generic-base"/>
  35143.     <category term="author-date"/>
  35144.     <updated>2008-11-16T18:00:00+00:00</updated>
  35145.   </info>
  35146.   <macro name="container-contributors">
  35147.     <choose>
  35148.       <if type="chapter">
  35149.     <text term="in" text-case="capitalize-first" suffix=" "/>
  35150.     <names variable="editor translator" delimiter=", " suffix=", ">
  35151.       <name and="symbol" initialize-with=". " delimiter=", "/>
  35152.       <label form="short" prefix=" (" text-case="capitalize-first" suffix=".)"/>
  35153.     </names>
  35154.       </if>
  35155.     </choose>
  35156.   </macro>
  35157.   <macro name="secondary-contributors">
  35158.     <choose>
  35159.       <if type="chapter" match="none">
  35160.     <names variable="editor translator" delimiter=", " prefix=" (" suffix=")">
  35161.       <name and="symbol" initialize-with=". " delimiter=", "/>
  35162.       <label form="short" prefix=", " text-case="capitalize-first" suffix="."/>
  35163.     </names>
  35164.       </if>
  35165.     </choose>
  35166.   </macro>
  35167.   <macro name="author">
  35168.     <names variable="author">
  35169.       <name name-as-sort-order="all" and="symbol" sort-separator=", "
  35170.         initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
  35171.       <label form="short" prefix=" (" suffix=".)" text-case="capitalize-first"/>
  35172.       <substitute>
  35173.         <names variable="editor"/>
  35174.         <names variable="translator"/>
  35175.         <text macro="title"/>
  35176.       </substitute>
  35177.     </names>
  35178.   </macro>
  35179.   <macro name="author-short">
  35180.     <names variable="author">
  35181.       <name form="short" and="symbol" delimiter=", " initialize-with=". "/>
  35182.       <substitute>
  35183.         <names variable="editor"/>
  35184.         <names variable="translator"/>
  35185.         <choose>
  35186.           <if type="book">
  35187.             <text variable="title" form="short" font-style="italic"/>
  35188.           </if>
  35189.           <else>
  35190.             <text variable="title" form="short" quotes="true"/>
  35191.           </else>
  35192.         </choose>
  35193.       </substitute>
  35194.     </names>
  35195.   </macro>
  35196.   <macro name="access">
  35197.     <choose>
  35198.       <if variable="DOI">
  35199.         <text variable="DOI" prefix="doi: "/>
  35200.       </if>
  35201.       <else>
  35202.         <group>
  35203.           <text term="retrieved" text-case="capitalize-first" suffix=" "/>
  35204.           <date variable="accessed" suffix=", ">
  35205.             <date-part name="month" suffix=" "/>
  35206.             <date-part name="day" suffix=", "/>
  35207.             <date-part name="year"/>
  35208.           </date>
  35209.           <group>
  35210.             <text term="from" suffix=" "/>
  35211.             <text variable="URL"/>
  35212.           </group>
  35213.         </group>
  35214.       </else>
  35215.     </choose>
  35216.   </macro>
  35217.   <macro name="title">
  35218.     <choose>
  35219.       <if type="book thesis" match="any">
  35220.         <text variable="title" font-style="italic"/>
  35221.       </if>
  35222.       <else>
  35223.         <text variable="title"/>
  35224.       </else>
  35225.     </choose>
  35226.   </macro>
  35227.   <macro name="publisher">
  35228.     <text variable="genre" suffix=", "/>
  35229.     <group delimiter=": ">
  35230.       <text variable="publisher-place"/>
  35231.       <text variable="publisher"/>
  35232.     </group>
  35233.   </macro>
  35234.   <macro name="event">
  35235.     <text variable="event"/>
  35236.     <text variable="event-place" prefix=", "/>
  35237.   </macro>
  35238.   <macro name="issued">
  35239.     <choose>
  35240.       <if variable="issued">
  35241.         <group prefix=" (" suffix=").">
  35242.           <date variable="issued">
  35243.             <date-part name="year"/>
  35244.           </date>
  35245.           <choose>
  35246.             <if type="book chapter article-journal" match="none">
  35247.               <date variable="issued">
  35248.                 <date-part prefix=", " name="month"/>
  35249.                 <date-part prefix=" " name="day"/>
  35250.               </date>
  35251.             </if>
  35252.           </choose>
  35253.         </group>
  35254.       </if>
  35255.       <else>
  35256.         <text prefix=" (" term="no date" suffix=")."/>
  35257.       </else>
  35258.     </choose>
  35259.   </macro>
  35260.   <macro name="issued-year">
  35261.     <choose>
  35262.       <if variable="issued">
  35263.         <date variable="issued">
  35264.           <date-part name="year"/>
  35265.         </date>
  35266.       </if>
  35267.       <else>
  35268.         <text term="no date" form="short"/>
  35269.       </else>
  35270.     </choose>
  35271.   </macro>
  35272.   <macro name="edition">
  35273.     <choose>
  35274.       <if type="book chapter" match="any">
  35275.     <choose>
  35276.       <if is-numeric="edition">
  35277.         <group delimiter=" ">
  35278.           <number variable="edition" form="ordinal"/>
  35279.           <text term="edition" form="short" suffix="."/>
  35280.         </group>
  35281.       </if>
  35282.       <else>
  35283.         <text variable="edition" suffix="."/>
  35284.       </else>
  35285.     </choose>
  35286.       </if>
  35287.     </choose>
  35288.   </macro>
  35289.   <macro name="locators">
  35290.     <choose>
  35291.       <if type="article-journal article-magazine article-newspaper" match="any">
  35292.         <group prefix=", " delimiter=", ">
  35293.           <group>
  35294.             <text variable="volume" font-style="italic"/>
  35295.             <text variable="issue" prefix="(" suffix=")"/>
  35296.           </group>
  35297.           <text variable="page"/>
  35298.          </group>
  35299.       </if>
  35300.       <else-if type="book chapter" match="any">
  35301.         <group prefix=" (" suffix=")" delimiter=", ">
  35302.           <text macro="edition"/>
  35303.           <group>
  35304.             <text term="volume" form="short" plural="true" text-case="capitalize-first" suffix=". "/>
  35305.             <number variable="number-of-volumes" form="numeric" prefix="1-"/>
  35306.           </group>
  35307.           <group>
  35308.             <text term="volume" form="short" text-case="capitalize-first" suffix=". "/>
  35309.             <number variable="volume" form="numeric"/>
  35310.           </group>
  35311.           <group>
  35312.             <label variable="page" form="short" include-period="true" suffix=" "/>
  35313.             <text variable="page"/>
  35314.           </group>
  35315.         </group>
  35316.       </else-if>
  35317.     </choose>
  35318.   </macro>
  35319.   <macro name="citation-locator">
  35320.     <group>
  35321.       <label variable="locator" include-period="true" form="short"/>
  35322.       <text variable="locator" prefix=" "/>
  35323.     </group>
  35324.   </macro>
  35325.   <citation>
  35326.     <option name="et-al-min" value="6"/>
  35327.     <option name="et-al-use-first" value="1"/>
  35328.     <option name="et-al-subsequent-min" value="3"/>
  35329.     <option name="et-al-subsequent-use-first" value="1"/>
  35330.     <option name="disambiguate-add-year-suffix" value="true"/>
  35331.     <option name="disambiguate-add-names" value="true"/>
  35332.     <option name="disambiguate-add-givenname" value="true"/>
  35333.     <option name="collapse" value="year"/>
  35334.     <sort>
  35335.       <key macro="author"/>
  35336.       <key variable="issued"/>
  35337.     </sort>
  35338.     <layout prefix="(" suffix=")" delimiter="; ">
  35339.       <group delimiter=", ">
  35340.         <text macro="author-short"/>
  35341.         <text macro="issued-year"/>
  35342.         <text macro="citation-locator"/>
  35343.       </group>
  35344.     </layout>
  35345.   </citation>
  35346.   <bibliography>
  35347.     <option name="hanging-indent" value="true"/>
  35348.     <option name="et-al-min" value="6"/>
  35349.     <option name="et-al-use-first" value="6"/>
  35350.     <option name="entry-spacing" value="0"/>
  35351.     <sort>
  35352.       <key macro="author"/>
  35353.       <key variable="issued"/>
  35354.     </sort>
  35355.     <layout suffix=".">
  35356.       <text macro="author" suffix="."/>
  35357.       <text macro="issued" suffix=" "/>
  35358.       <group delimiter=". ">
  35359.         <text macro="title"/>
  35360.         <group>
  35361.           <text macro="container-contributors"/>
  35362.           <text macro="secondary-contributors"/>
  35363.           <group delimiter=", ">
  35364.             <text variable="container-title" font-style="italic"/>
  35365.             <text variable="collection-title"/>
  35366.           </group>
  35367.         </group>
  35368.       </group>
  35369.       <text macro="locators"/>
  35370.       <group delimiter=". " prefix=". ">
  35371.         <text macro="publisher"/>
  35372.         <text macro="access"/>
  35373.       </group>
  35374.     </layout>
  35375.   </bibliography>
  35376. </style>
  35377. ');
  35378.  
  35379. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/apsa', '2008-11-16 18:00:00', 'American Political Science Association',
  35380. '<?xml version="1.0" encoding="UTF-8"?>
  35381. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  35382.   <info>
  35383.     <title>American Political Science Association</title>
  35384.     <id>http://www.zotero.org/styles/apsa</id>
  35385.     <link href="http://www.zotero.org/styles/apsa"/>
  35386.     <author>
  35387.       <name>Julian Onions</name>
  35388.       <email>julian.onions@gmail.com</email>
  35389.     </author>
  35390.     <category term="author-date"/>
  35391.     <category term="political_science"/>
  35392.     <updated>2008-11-16T18:00:00+00:00</updated>
  35393.     <summary>The American Political Science Association style.</summary>
  35394.     <link href="http://www.wisc.edu/writing/Handbook/DocAPSA.html" rel="documentation"/>
  35395.   </info>
  35396.   <macro name="editor">
  35397.     <names variable="editor" delimiter=", ">
  35398.       <label form="short" text-case="lowercase" suffix=". "/>
  35399.       <name and="text"  delimiter=", "/>
  35400.     </names>
  35401.   </macro>
  35402.   <macro name="author">
  35403.     <names variable="author">
  35404.       <name name-as-sort-order="first" and="text" sort-separator=", " 
  35405.         delimiter=", " delimiter-precedes-last="always"/>
  35406.       <label form="short" prefix=", " suffix="." text-case="lowercase"/>
  35407.       <substitute>
  35408.     <names variable="editor"/>
  35409.     <text variable="title"/>
  35410.       </substitute>
  35411.     </names>
  35412.   </macro>
  35413.   <macro name="author-short">
  35414.     <names variable="author">
  35415.       <name form="short" and="text" delimiter=", " initialize-with=". "/>
  35416.       <substitute>
  35417.     <names variable="editor"/>
  35418.     <names variable="translator"/>
  35419.     <text variable="title"/>
  35420.       </substitute>
  35421.     </names>
  35422.   </macro>
  35423.   <macro name="access">
  35424.     <group delimiter=" ">
  35425.       <text value="Available at:"/>
  35426.       <text variable="URL"/>
  35427.       <group prefix="[" suffix="]">
  35428.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  35429.     <date variable="accessed">
  35430.       <date-part name="month" suffix=" "/>
  35431.       <date-part name="day" suffix=", "/>
  35432.       <date-part name="year"/>
  35433.     </date>
  35434.       </group>
  35435.     </group>
  35436.   </macro>
  35437.   <macro name="title">
  35438.     <choose>
  35439.       <if type="book">
  35440.     <text variable="title" font-style="italic"/>
  35441.       </if>
  35442.       <else>
  35443.     <text variable="title"/>
  35444.       </else>
  35445.     </choose>
  35446.   </macro>
  35447.   <macro name="publisher">
  35448.     <group delimiter=": ">
  35449.       <text variable="publisher-place"/>
  35450.       <text variable="publisher"/>
  35451.     </group>
  35452.   </macro>
  35453.   <macro name="year-date">
  35454.     <group prefix=" ">
  35455.       <choose>
  35456.     <if variable="issued">
  35457.       <date variable="issued">
  35458.         <date-part name="year"/>
  35459.       </date>
  35460.     </if>
  35461.     <else>
  35462.       <text term="no date"/>
  35463.     </else>
  35464.       </choose>
  35465.     </group>
  35466.   </macro>
  35467.   <macro name="edition">
  35468.     <choose>
  35469.       <if is-numeric="edition">
  35470.     <group delimiter=" ">
  35471.       <number variable="edition" form="ordinal"/>
  35472.       <text term="edition" form="short" suffix="."/>
  35473.     </group>
  35474.       </if>
  35475.       <else>
  35476.       <text variable="edition" suffix="."/>
  35477.       </else>
  35478.     </choose>
  35479.   </macro>
  35480.   <citation>
  35481.     <option name="et-al-min" value="4"/>
  35482.     <option name="et-al-use-first" value="1"/>
  35483.     <option name="et-al-subsequent-min" value="6"/>
  35484.     <option name="et-al-subsequent-use-first" value="1"/>
  35485.     <option name="disambiguate-add-year-suffix" value="true"/>
  35486.     <option name="disambiguate-add-names" value="true"/>
  35487.     <option name="disambiguate-add-givenname" value="true"/>
  35488.     <option name="collapse" value="year"/>
  35489.     <layout prefix="(" suffix=")" delimiter="; ">
  35490.       <group delimiter=", ">
  35491.     <group delimiter=" ">
  35492.       <text macro="author-short"/>
  35493.       <text macro="year-date"/>
  35494.     </group>
  35495.     <text variable="locator"/>
  35496.       </group>
  35497.     </layout>
  35498.   </citation>
  35499.   <bibliography>
  35500.     <option name="hanging-indent" value="true"/>
  35501.     <option name="et-al-min" value="4"/>
  35502.     <option name="et-al-use-first" value="1"/>
  35503.     <sort>
  35504.       <key macro="author"/>
  35505.       <key variable="title"/>
  35506.     </sort>
  35507.     <layout>
  35508.       <text macro="author" suffix="."/>
  35509.       <date variable="issued" prefix=" " suffix=".">
  35510.     <date-part name="year"/>
  35511.       </date>
  35512.       <choose>
  35513.     <if type="book">
  35514.       <group prefix=" " delimiter=" ">
  35515.         <text macro="title" suffix="."/>
  35516.         <text macro="edition"/>
  35517.         <text macro="editor" suffix="."/>
  35518.       </group>
  35519.       <text prefix=" " suffix="." macro="publisher"/>
  35520.     </if>
  35521.     <else-if type="chapter">
  35522.       <text macro="title" prefix=" " suffix="." quotes="true"/>
  35523.       <group class="container" prefix=" " delimiter=" ">
  35524.         <text term="in" text-case="capitalize-first"/>
  35525.         <text variable="container-title" font-style="italic" suffix=","/>
  35526.         <text variable="collection-title" suffix=","/>
  35527.         <text macro="editor" suffix="."/>
  35528.         <group suffix=".">
  35529.           <text macro="publisher"/>
  35530.           <group prefix=", ">
  35531.         <text variable="page" prefix="p. "/>
  35532.           </group>
  35533.         </group>
  35534.       </group>
  35535.     </else-if>
  35536.     <else>
  35537.       <group prefix=" " delimiter=" " suffix=".">
  35538.         <text macro="title" quotes="true"/>
  35539.         <text macro="editor" />
  35540.       </group>
  35541.       <group class="container" prefix=" " suffix=".">
  35542.         <text variable="container-title" font-style="italic"/>
  35543.         <group prefix=" ">
  35544.           <text variable="volume" />
  35545.           <text variable="issue" prefix="(" suffix=")"/>
  35546.         </group>
  35547.         <text variable="page" prefix=":"/>
  35548.       </group>
  35549.     </else>
  35550.       </choose>
  35551.       <text prefix=" " macro="access" suffix="."/>
  35552.     </layout>
  35553.   </bibliography>
  35554. </style>
  35555. ');
  35556.  
  35557. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/asa', '2008-11-16 18:00:00', 'American Sociological Association',
  35558. '<?xml version="1.0" encoding="UTF-8"?>
  35559. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  35560.   <info>
  35561.     <title>American Sociological Association</title>
  35562.     <id>http://www.zotero.org/styles/asa</id>
  35563.     <link href="http://www.zotero.org/styles/asa"/>
  35564.     <author>
  35565.       <name>Julian Onions</name>
  35566.       <email>julian.onions@gmail.com</email>
  35567.     </author>
  35568.     <category term="author-date"/>
  35569.     <category term="sociology"/>
  35570.     <updated>2008-11-16T18:00:00+00:00</updated>
  35571.     <summary>The ASA style.</summary>
  35572.     <link href="http://www.asanet.org/galleries/default-file/asaguidelinesnew.pdf" rel="documentation"/>
  35573.   </info>
  35574.   <macro name="editor">
  35575.     <names variable="editor">
  35576.       <label form="verb" text-case="lowercase" suffix=" "/>
  35577.       <name and="text" delimiter=", "/>
  35578.     </names>
  35579.   </macro>
  35580.   <macro name="series-editor">
  35581.     <names variable="original-author">
  35582.       <label form="short" text-case="capitalize-first" suffix=". "/>
  35583.       <name and="text" delimiter=", "/>
  35584.     </names>
  35585.   </macro>
  35586.   <macro name="anon">
  35587.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  35588.   </macro>
  35589.   <macro name="author">
  35590.     <names variable="author">
  35591.       <name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", "
  35592.         delimiter-precedes-last="always"/>
  35593.       <label form="short" prefix=", " suffix="." text-case="lowercase"/>
  35594.       <substitute>
  35595.     <names variable="editor"/>
  35596.     <names variable="translator"/>
  35597.     <text macro="anon"/>
  35598.       </substitute>
  35599.     </names>
  35600.   </macro>
  35601.   <macro name="author-short">
  35602.     <names variable="author">
  35603.       <name form="short" and="text" delimiter=", "/>
  35604.       <substitute>
  35605.     <names variable="editor"/>
  35606.     <names variable="translator"/>
  35607.     <text macro="anon"/>
  35608.       </substitute>
  35609.     </names>
  35610.   </macro>
  35611.   <macro name="access">
  35612.     <group>
  35613.       <text variable="URL"/>
  35614.       <group prefix=" (" suffix=")">
  35615.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  35616.     <date variable="accessed">
  35617.       <date-part name="month" suffix=" "/>
  35618.       <date-part name="day" suffix=", "/>
  35619.       <date-part name="year"/>
  35620.     </date>
  35621.       </group>
  35622.     </group>
  35623.   </macro>
  35624.   <macro name="title">
  35625.     <choose>
  35626.       <if type="thesis">
  35627.     <text variable="title"/>
  35628.       </if>
  35629.       <else-if type="book">
  35630.     <text variable="title" font-style="italic"/>
  35631.       </else-if>
  35632.       <else>
  35633.     <text variable="title" quotes="true"/>
  35634.       </else>
  35635.     </choose>
  35636.   </macro>
  35637.   <macro name="publisher">
  35638.     <group delimiter=": " >
  35639.       <text variable="publisher-place"/>
  35640.       <text variable="publisher"/>
  35641.     </group>
  35642.   </macro>
  35643.   <macro name="year-date">
  35644.     <choose>
  35645.       <if variable="issued">
  35646.     <date variable="issued">
  35647.       <date-part name="year"/>
  35648.     </date>
  35649.       </if>
  35650.       <else>
  35651.     <text term="no date" form="short"/>
  35652.       </else>
  35653.     </choose>
  35654.   </macro>
  35655.   <macro name="day-month">
  35656.     <date variable="issued">
  35657.       <date-part name="month"/>
  35658.       <date-part name="day" prefix=" "/>
  35659.     </date>
  35660.   </macro>
  35661.   <macro name="pages">
  35662.     <label variable="page" form="short" suffix=". " text-case="capitalize-first"/>
  35663.     <text variable="page"/>
  35664.   </macro>
  35665.   <macro name="edition">
  35666.     <choose>
  35667.       <if is-numeric="edition">
  35668.     <group delimiter=" ">
  35669.       <number variable="edition" form="ordinal"/>
  35670.       <text term="edition" form="short" suffix="."/>
  35671.     </group>
  35672.       </if>
  35673.       <else>
  35674.       <text variable="edition" suffix="."/>
  35675.       </else>
  35676.     </choose>
  35677.   </macro>
  35678.   <citation>
  35679.     <option name="et-al-min" value="4"/>
  35680.     <option name="et-al-use-first" value="1"/>
  35681.     <option name="et-al-subsequent-min" value="3"/>
  35682.     <option name="et-al-subsequent-use-first" value="1"/>
  35683.     <option name="disambiguate-add-year-suffix" value="true"/>
  35684.     <option name="disambiguate-add-names" value="true"/>
  35685.     <option name="disambiguate-add-givenname" value="true"/>
  35686.     <option name="collapse" value="year"/>
  35687.     <layout prefix="(" suffix=")" delimiter="; ">
  35688.       <group delimiter=":">
  35689.     <group delimiter=" ">
  35690.       <text macro="author-short"/>
  35691.       <text macro="year-date"/>
  35692.     </group>
  35693.     <text variable="locator"/>
  35694.       </group>
  35695.     </layout>
  35696.   </citation>
  35697.   <bibliography>
  35698.     <option name="hanging-indent" value="true"/>
  35699.     <option name="et-al-min" value="6"/>
  35700.     <option name="et-al-use-first" value="1"/>
  35701.     <sort>
  35702.       <key macro="author"/>
  35703.       <key variable="title"/>
  35704.     </sort>
  35705.     <layout suffix=".">
  35706.       <group delimiter=" ">
  35707.     <text macro="author" suffix="."/>
  35708.     <text macro="year-date" suffix="."/>
  35709.       </group>
  35710.       <choose>
  35711.     <if type="article-newspaper article-magazine" match="any">
  35712.       <group delimiter=" ">
  35713.         <text macro="title" prefix=" " suffix="."/>
  35714.       </group>
  35715.       <group prefix=" " delimiter=", ">
  35716.         <text variable="container-title" font-style="italic"/>
  35717.         <text macro="day-month"/>
  35718.         <text variable="edition"/>
  35719.         <text variable="page"/>
  35720.       </group>
  35721.     </if>
  35722.     <else-if type="thesis">
  35723.       <text macro="title" prefix=" " suffix="." quotes="true"/>
  35724.       <group prefix=" " delimiter=", ">
  35725.         <text macro="edition" />
  35726.         <text macro="editor" suffix="."/>
  35727.         <text variable="genre"/>
  35728.         <text macro="publisher"/>
  35729.       </group>
  35730.     </else-if>
  35731.     <else-if type="book">
  35732.       <group delimiter=" ">
  35733.         <text macro="title" prefix=" " suffix="."/>
  35734.         <text macro="edition" />
  35735.         <text macro="editor" suffix="."/>
  35736.         <text macro="publisher"/>
  35737.       </group>
  35738.     </else-if>
  35739.     <else-if type="chapter">
  35740.       <group delimiter=" ">
  35741.         <text macro="title" prefix=" " suffix="."/>
  35742.         <group class="container" delimiter=", " suffix=".">
  35743.           <group delimiter=" ">
  35744.         <text macro="pages"/>
  35745.         <text term="in" text-case="lowercase"/>
  35746.         <text variable="container-title" font-style="italic"/>
  35747.           </group>
  35748.           <text variable="volume" prefix="vol. "/>
  35749.           <text variable="collection-title" font-style="italic"/>
  35750.           <text macro="editor"/>
  35751.         </group>
  35752.         <text macro="publisher"/>
  35753.       </group>
  35754.     </else-if>
  35755.     <else>
  35756.       <group suffix="." >
  35757.         <text macro="title" prefix=" " />
  35758.         <text macro="editor" prefix=" "/>
  35759.       </group>
  35760.       <group class="container" prefix=" " suffix="." delimiter=" ">
  35761.         <text variable="container-title" font-style="italic"/>
  35762.         <group delimiter=":">
  35763.           <text variable="volume" />
  35764.           <text variable="page"/>
  35765.         </group>
  35766.       </group>
  35767.     </else>
  35768.       </choose>
  35769.       <text prefix=" " macro="access" suffix="."/>
  35770.     </layout>
  35771.   </bibliography>
  35772. </style>
  35773. ');
  35774.  
  35775. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-author-date', '2008-11-16 18:00:00', 'Chicago Manual of Style (Author-Date format)',
  35776. '<?xml version="1.0" encoding="UTF-8"?>
  35777. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  35778.   <info>
  35779.     <title>Chicago Manual of Style (Author-Date format)</title>
  35780.     <id>http://www.zotero.org/styles/chicago-author-date</id>
  35781.     <link href="http://www.zotero.org/styles/chicago-author-date"/>
  35782.     <author>
  35783.       <name>Julian Onions</name>
  35784.       <email>julian.onions@gmail.com</email>
  35785.     </author>
  35786.     <category term="author-date"/>
  35787.     <category term="generic-base"/>
  35788.     <updated>2008-11-16T18:00:00+00:00</updated>
  35789.     <summary>The author-date variant of the Chicago style</summary>
  35790.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  35791.   </info>
  35792.   <macro name="secondary-contributors">
  35793.     <choose>
  35794.       <if type="chapter" match="none">
  35795.     <group delimiter=". ">
  35796.       <choose>
  35797.         <if variable="author">
  35798.       <names variable="editor">
  35799.         <label form="verb-short" prefix=" " text-case="capitalize-first" suffix=". "/>
  35800.         <name and="text" delimiter=", "/>
  35801.       </names>
  35802.         </if>
  35803.       </choose>
  35804.       <choose>
  35805.         <if variable="author editor" match="any">
  35806.           <names variable="translator">
  35807.             <label form="verb-short" prefix=" " text-case="capitalize-first" suffix=". "/>
  35808.             <name and="text" delimiter=", "/>
  35809.           </names>
  35810.         </if>
  35811.       </choose>
  35812.     </group>
  35813.       </if>
  35814.     </choose>
  35815.   </macro>
  35816.   <macro name="container-contributors">
  35817.     <choose>
  35818.       <if type="chapter">
  35819.     <group prefix="," delimiter=", ">
  35820.       <choose>
  35821.         <if variable="author">
  35822.       <names variable="editor">
  35823.         <label form="verb-short" prefix=" " text-case="lowercase" suffix=". "/>
  35824.         <name and="text" delimiter=", "/>
  35825.       </names>
  35826.         </if>
  35827.       </choose>
  35828.       <choose>
  35829.         <if variable="author editor" match="any">
  35830.           <names variable="translator">
  35831.             <label form="verb-short" prefix=" " text-case="lowercase" suffix=". "/>
  35832.             <name and="text" delimiter=", "/>
  35833.           </names>
  35834.         </if>
  35835.       </choose>
  35836.     </group>
  35837.       </if>
  35838.     </choose>
  35839.   </macro>
  35840.   <macro name="anon">
  35841.     <choose>
  35842.       <if variable="author editor translator" match="none">
  35843.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  35844.       </if>
  35845.     </choose>
  35846.   </macro>
  35847.   <macro name="editor">
  35848.     <names variable="editor">
  35849.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  35850.       <label form="short" prefix=", " suffix="."/>
  35851.     </names>
  35852.   </macro>
  35853.   <macro name="translator">
  35854.     <names variable="translator">
  35855.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  35856.       <label form="verb-short" prefix=", " suffix="."/>
  35857.     </names>
  35858.   </macro>
  35859.   <macro name="recipient">
  35860.     <choose>
  35861.       <if type="personal_communication">
  35862.         <choose>
  35863.             <if variable="genre">
  35864.         <text variable="genre" text-case="capitalize-first"/>
  35865.             </if>
  35866.             <else>
  35867.         <text term="letter" text-case="capitalize-first"/>
  35868.           </else>
  35869.         </choose>
  35870.       </if>
  35871.     </choose>
  35872.     <names variable="recipient" delimiter=", ">
  35873.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  35874.       <name and="text" delimiter=", "/>
  35875.     </names>
  35876.   </macro>
  35877.   <macro name="contributors">
  35878.     <names variable="author">
  35879.       <name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", "
  35880.         delimiter-precedes-last="always"/>
  35881.       <label form="verb-short" prefix=", " suffix="." text-case="lowercase"/>
  35882.       <substitute>
  35883.         <text macro="editor"/>
  35884.         <text macro="translator"/>
  35885.       </substitute>
  35886.     </names>
  35887.     <text macro="anon"/>
  35888.     <text macro="recipient"/>
  35889.   </macro>
  35890.   <macro name="contributors-short">
  35891.     <names variable="author">
  35892.       <name form="short" and="text" delimiter=", "/>
  35893.       <substitute>
  35894.         <names variable="editor"/>
  35895.         <names variable="translator"/>
  35896.       </substitute>
  35897.     </names>
  35898.     <text macro="anon"/>
  35899.   </macro>
  35900.   <macro name="interviewer">
  35901.     <names variable="interviewer" delimiter=", ">
  35902.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  35903.       <name and="text" delimiter=", "/>
  35904.     </names>
  35905.   </macro>
  35906.   <macro name="archive">
  35907.     <group delimiter=". ">
  35908.       <text variable="archive_location" text-case="capitalize-first"/>
  35909.       <text variable="archive"/>
  35910.       <text variable="archive-place"/>
  35911.     </group>
  35912.   </macro>
  35913.   <macro name="access">
  35914.     <group delimiter=". ">
  35915.       <choose>
  35916.         <if type="graphic report" match="any">
  35917.       <text macro="archive"/>
  35918.         </if>
  35919.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  35920.       <text macro="archive"/>
  35921.         </else-if>
  35922.       </choose>
  35923.       <text variable="DOI" prefix="doi:"/>
  35924.       <text variable="URL"/>
  35925.     </group>
  35926.   </macro>
  35927.   <macro name="title">
  35928.     <choose>
  35929.       <if variable="title" match="none">
  35930.         <choose>
  35931.           <if type="personal_communication" match="none">
  35932.         <text variable="genre" text-case="capitalize-first"/>
  35933.           </if>
  35934.         </choose>
  35935.       </if>
  35936.       <else-if type="book">
  35937.         <text variable="title" font-style="italic"/>
  35938.       </else-if>
  35939.       <else>
  35940.         <text variable="title"/>
  35941.       </else>
  35942.     </choose>
  35943.   </macro>
  35944.   <macro name="edition">
  35945.     <choose>
  35946.       <if type="book chapter" match="any">
  35947.     <choose>
  35948.       <if is-numeric="edition">
  35949.         <group delimiter=" ">
  35950.           <number variable="edition" form="ordinal"/>
  35951.           <text term="edition" form="short" suffix="."/>
  35952.         </group>
  35953.       </if>
  35954.       <else>
  35955.         <text variable="edition" suffix="."/>
  35956.       </else>
  35957.     </choose>
  35958.       </if>
  35959.     </choose>
  35960.   </macro>
  35961.   <macro name="locators">
  35962.     <choose>
  35963.       <if type="article-journal">
  35964.         <text variable="volume" prefix=" "/>
  35965.         <text variable="issue" prefix=", no. "/>
  35966.       </if>
  35967.       <else-if type="book">
  35968.         <group prefix=". " delimiter=". ">
  35969.           <group>
  35970.             <text term="volume" form="short" text-case="capitalize-first" suffix=". "/>
  35971.             <number variable="volume" form="numeric"/>
  35972.           </group>
  35973.           <group>
  35974.             <number variable="number-of-volumes" form="numeric"/>
  35975.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  35976.           </group>
  35977.         </group>
  35978.       </else-if>
  35979.     </choose>
  35980.   </macro>
  35981.   <macro name="locators-chapter">
  35982.     <choose>
  35983.       <if type="chapter">
  35984.         <group prefix=", ">
  35985.           <text variable="volume" suffix=":"/>
  35986.           <text variable="page"/>
  35987.         </group>
  35988.       </if>
  35989.     </choose>
  35990.   </macro>
  35991.   <macro name="locators-article">
  35992.     <choose>
  35993.       <if type="article-newspaper">
  35994.         <group prefix=", " delimiter=", ">
  35995.           <group>
  35996.         <text variable="edition" suffix=" "/>
  35997.         <text term="edition" prefix=" "/>
  35998.           </group>
  35999.           <group>
  36000.         <text term="section" form="short" suffix=". "/>
  36001.         <text variable="section"/>
  36002.           </group>
  36003.         </group>
  36004.       </if>
  36005.       <else-if type="article-journal">
  36006.     <text variable="page" prefix=": "/>
  36007.       </else-if>
  36008.     </choose>
  36009.   </macro>
  36010.   <macro name="point-locators">
  36011.     <group>
  36012.       <choose>
  36013.         <if locator="page" match="none">
  36014.       <label variable="locator" form="short" include-period="true" suffix=" "/>
  36015.         </if>
  36016.       </choose>
  36017.       <text variable="locator"/>
  36018.     </group>
  36019.   </macro>
  36020.   <macro name="container-prefix">
  36021.     <text term="in" text-case="capitalize-first"/>
  36022.   </macro>
  36023.   <macro name="container-title">
  36024.     <choose>
  36025.       <if type="chapter">
  36026.         <text macro="container-prefix" suffix=" "/>
  36027.       </if>
  36028.     </choose>
  36029.     <text variable="container-title" font-style="italic"/>
  36030.   </macro>
  36031.   <macro name="publisher">
  36032.     <group delimiter=": ">
  36033.       <text variable="publisher-place"/>
  36034.       <text variable="publisher"/>
  36035.     </group>
  36036.   </macro>
  36037.   <macro name="date">
  36038.     <date variable="issued">
  36039.       <date-part name="year"/>
  36040.     </date>
  36041.   </macro>
  36042.   <macro name="day-month">
  36043.     <date variable="issued">
  36044.       <date-part name="month"/>
  36045.       <date-part name="day" prefix=" "/>
  36046.     </date>
  36047.   </macro>
  36048.   <macro name="collection-title">
  36049.     <text variable="collection-title"/>
  36050.     <text variable="collection-number" prefix=" "/>
  36051.   </macro>
  36052.   <macro name="event">
  36053.     <group>
  36054.       <text term="presented at" suffix=" "/>
  36055.       <text variable="event"/>
  36056.     </group>
  36057.   </macro>
  36058.   <macro name="description">
  36059.     <group delimiter=". ">
  36060.       <text macro="interviewer"/>
  36061.       <text variable="medium" text-case="capitalize-first"/>
  36062.     </group>
  36063.     <choose>
  36064.       <if variable="title" match="none"> </if>
  36065.       <else-if type="thesis"> </else-if>
  36066.       <else>
  36067.         <text variable="genre" text-case="capitalize-first" prefix=". "/>
  36068.       </else>
  36069.     </choose>
  36070.   </macro>
  36071.   <macro name="issue">
  36072.     <choose>
  36073.       <if type="article-journal">
  36074.         <text macro="day-month" prefix=" (" suffix=")"/>
  36075.       </if>
  36076.       <else-if type="speech">
  36077.         <group prefix=" " delimiter=", ">
  36078.           <text macro="event"/>
  36079.           <text macro="day-month"/>
  36080.           <text variable="event-place"/>
  36081.         </group>
  36082.       </else-if>
  36083.       <else-if type="article-newspaper article-magazine" match="any">
  36084.         <text macro="day-month" prefix=", "/>
  36085.       </else-if>
  36086.       <else>
  36087.         <group prefix=". " delimiter=", ">
  36088.           <choose>
  36089.             <if type="thesis">
  36090.               <text variable="genre" text-case="capitalize-first"/>
  36091.             </if>
  36092.           </choose>
  36093.           <text macro="publisher"/>
  36094.           <text macro="day-month"/>
  36095.         </group>
  36096.       </else>
  36097.     </choose>
  36098.   </macro>
  36099.   <citation>
  36100.     <option name="et-al-min" value="4"/>
  36101.     <option name="et-al-use-first" value="1"/>
  36102.     <option name="et-al-subsequent-min" value="4"/>
  36103.     <option name="et-al-subsequent-use-first" value="1"/>
  36104.     <option name="disambiguate-add-year-suffix" value="true"/>
  36105.     <option name="disambiguate-add-names" value="true"/>
  36106.     <option name="disambiguate-add-givenname" value="true"/>
  36107.     <layout prefix="(" suffix=")" delimiter="; ">
  36108.       <group delimiter=", ">
  36109.         <group delimiter=" ">
  36110.           <text macro="contributors-short"/>
  36111.           <text macro="date"/>
  36112.         </group>
  36113.         <text macro="point-locators"/>
  36114.       </group>
  36115.     </layout>
  36116.   </citation>
  36117.   <bibliography>
  36118.     <option name="hanging-indent" value="true"/>
  36119.     <option name="et-al-min" value="11"/>
  36120.     <option name="et-al-use-first" value="7"/>
  36121.     <option name="subsequent-author-substitute" value="---"/>
  36122.     <option name="entry-spacing" value="0"/>
  36123.     <sort>
  36124.       <key macro="contributors"/>
  36125.       <key variable="issued"/>
  36126.     </sort>
  36127.     <layout suffix=".">
  36128.       <text macro="contributors" suffix=". "/>
  36129.       <text macro="date" suffix=". "/>
  36130.       <text macro="title"/>
  36131.       <text macro="description"/>
  36132.       <text macro="secondary-contributors" prefix=". "/>
  36133.       <text macro="container-title" prefix=". "/>
  36134.       <text macro="container-contributors"/>
  36135.       <text macro="locators-chapter"/>
  36136.       <text macro="edition" prefix=". "/>
  36137.       <text macro="locators"/>
  36138.       <text macro="collection-title" prefix=". "/>
  36139.       <text macro="issue"/>
  36140.       <text macro="locators-article"/>
  36141.       <text macro="access" prefix=". "/>
  36142.     </layout>
  36143.   </bibliography>
  36144. </style>
  36145. ');
  36146.  
  36147. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-fullnote-bibliography', '2008-11-16 18:00:00', 'Chicago Manual of Style (Full Note with Bibliography)',
  36148. '<style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en"> 
  36149.   <info>
  36150.     <title>Chicago Manual of Style (Full Note with Bibliography)</title>
  36151.     <id>http://www.zotero.org/styles/chicago-fullnote-bibliography</id>
  36152.     <link href="http://www.zotero.org/styles/chicago-fullnote-bibliography"/>
  36153.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  36154.     <author>
  36155.       <name>Julian Onions</name>
  36156.       <email>julian.onions@gmail.com</email>
  36157.     </author>
  36158.     <contributor>
  36159.       <name>Simon Kornblith</name>
  36160.       <email>simon@simonster.com</email> 
  36161.     </contributor>
  36162.     <contributor>
  36163.       <name>Elena Razlogova</name>
  36164.       <email>elena.razlogova@gmail.com</email> 
  36165.     </contributor>
  36166.     <summary>Chicago format with full notes and bibliography</summary>
  36167.     <category term="generic-base"/>
  36168.     <category term="numeric"/>
  36169.     <updated>2008-11-16T18:00:00+00:00</updated>
  36170.   </info>
  36171.   <macro name="editor-translator">
  36172.     <group delimiter=", ">
  36173.       <choose>
  36174.         <if variable="author">
  36175.       <names variable="editor" delimiter=", ">
  36176.         <label form="verb-short" text-case="lowercase" suffix=". "/>
  36177.         <name and="text" delimiter=", "/>
  36178.       </names>
  36179.         </if>
  36180.       </choose>
  36181.       <choose>
  36182.         <if variable="author editor" match="any">
  36183.       <names variable="translator" delimiter=", ">
  36184.         <label form="verb-short" text-case="lowercase" suffix=". "/>
  36185.         <name and="text" delimiter=", "/>
  36186.       </names>
  36187.         </if>
  36188.       </choose>
  36189.     </group>
  36190.   </macro>
  36191.   <macro name="secondary-contributors-note">
  36192.     <choose>
  36193.       <if type="chapter" match="none">
  36194.         <text macro="editor-translator"/>
  36195.       </if>
  36196.     </choose>
  36197.   </macro>
  36198.   <macro name="container-contributors-note">
  36199.     <choose>
  36200.       <if type="chapter">
  36201.         <text macro="editor-translator"/>
  36202.       </if>
  36203.     </choose>
  36204.   </macro>
  36205.   <macro name="secondary-contributors">
  36206.     <choose>
  36207.       <if type="chapter" match="none">
  36208.     <group delimiter=". ">
  36209.       <choose>
  36210.         <if variable="author">
  36211.       <names variable="editor" delimiter=". ">
  36212.         <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  36213.         <name and="text" delimiter=", "/>
  36214.       </names>
  36215.         </if>
  36216.       </choose>
  36217.       <choose>
  36218.         <if variable="author editor" match="any">
  36219.       <names variable="translator" delimiter=". ">
  36220.         <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  36221.         <name and="text" delimiter=", "/>
  36222.       </names>
  36223.         </if>
  36224.       </choose>
  36225.     </group>
  36226.       </if>
  36227.     </choose>
  36228.   </macro>
  36229.   <macro name="container-contributors">
  36230.     <choose>
  36231.       <if type="chapter">
  36232.     <group delimiter=", ">
  36233.       <choose>
  36234.         <if variable="author">
  36235.       <names variable="editor" delimiter=", ">
  36236.         <label form="verb" text-case="lowercase" suffix=" "/>
  36237.         <name and="text" delimiter=", "/>
  36238.       </names>
  36239.         </if>
  36240.       </choose>
  36241.       <choose>
  36242.         <if variable="author editor" match="any">
  36243.       <names variable="translator" delimiter=", ">
  36244.         <label form="verb" text-case="lowercase" suffix=" "/>
  36245.         <name and="text" delimiter=", "/>
  36246.       </names>
  36247.         </if>
  36248.       </choose>
  36249.     </group>
  36250.       </if>
  36251.     </choose>
  36252.   </macro>
  36253.   <macro name="editor-note">
  36254.     <names variable="editor">
  36255.       <name and="text" sort-separator=", " delimiter=", "/>
  36256.       <label form="short" prefix=", " suffix="."/>
  36257.     </names>
  36258.   </macro>
  36259.   <macro name="translator-note">
  36260.     <names variable="translator">
  36261.       <name and="text" sort-separator=", " delimiter=", "/>
  36262.       <label form="verb-short" prefix=", " suffix="."/>
  36263.     </names>
  36264.   </macro>
  36265.   <macro name="recipient-note">
  36266.     <names variable="recipient" delimiter=", ">
  36267.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  36268.       <name and="text" delimiter=", "/>
  36269.     </names>
  36270.   </macro>
  36271.   <macro name="contributors-note">
  36272.     <names variable="author">
  36273.       <name and="text" sort-separator=", " delimiter=", "/>
  36274.       <substitute>
  36275.     <text macro="editor-note"/>
  36276.     <text macro="translator-note"/>
  36277.       </substitute>
  36278.     </names>
  36279.     <text macro="recipient-note"/>
  36280.   </macro>
  36281.   <macro name="editor">
  36282.     <names variable="editor">
  36283.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  36284.       <label form="short" prefix=", " suffix="."/>
  36285.     </names>
  36286.   </macro>
  36287.   <macro name="translator">
  36288.     <names variable="translator">
  36289.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  36290.       <label form="verb-short" prefix=", " suffix="."/>
  36291.     </names>
  36292.   </macro>
  36293.   <macro name="recipient">
  36294.     <choose>
  36295.       <if type="personal_communication">
  36296.         <choose>
  36297.             <if variable="genre">
  36298.         <text variable="genre" text-case="capitalize-first"/>
  36299.             </if>
  36300.             <else>
  36301.         <text term="letter" text-case="capitalize-first"/>
  36302.           </else>
  36303.         </choose>
  36304.       </if>
  36305.     </choose>
  36306.     <text macro="recipient-note" prefix=" "/>
  36307.   </macro>
  36308.   <macro name="contributors">
  36309.     <names variable="author">
  36310.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  36311.       <substitute>
  36312.     <text macro="editor"/>
  36313.     <text macro="translator"/>
  36314.       </substitute>
  36315.     </names>
  36316.     <text macro="recipient" prefix=". "/>
  36317.   </macro>
  36318.   <macro name="recipient-short">
  36319.     <names variable="recipient"> 
  36320.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  36321.       <name form="short" and="text" delimiter=", " />
  36322.     </names>
  36323.   </macro>
  36324.   <macro name="contributors-short">
  36325.     <names variable="author">
  36326.       <name form="short" and="text" delimiter=", " />
  36327.       <substitute>
  36328.     <names variable="editor"/>
  36329.     <names variable="translator"/>
  36330.       </substitute>
  36331.     </names>
  36332.     <text macro="recipient-short"/>
  36333.   </macro>
  36334.   <macro name="contributors-sort">
  36335.     <names variable="author">
  36336.       <name name-as-sort-order="all" and="text" sort-separator=", "
  36337.         delimiter=", " delimiter-precedes-last="always"/>
  36338.       <label form="verb-short" prefix=", " suffix="."/>
  36339.       <substitute>
  36340.     <names variable="editor"/>
  36341.     <names variable="translator"/>
  36342.       </substitute>
  36343.     </names>
  36344.   </macro>
  36345.   <macro name="interviewer-note">
  36346.     <names variable="interviewer" delimiter=", ">
  36347.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  36348.       <name and="text" delimiter=", "/>
  36349.     </names>
  36350.   </macro>
  36351.   <macro name="interviewer">
  36352.     <names variable="interviewer" delimiter=", ">
  36353.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  36354.       <name and="text" delimiter=", "/>
  36355.     </names>
  36356.   </macro>
  36357.   <macro name="title-note">
  36358.     <choose>
  36359.       <if variable="title" match="none">
  36360.         <text variable="genre"/>
  36361.       </if>
  36362.       <else-if type="book">
  36363.         <text variable="title" font-style="italic"/>
  36364.       </else-if>
  36365.       <else>
  36366.         <text variable="title" quotes="true"/>
  36367.       </else>
  36368.     </choose>
  36369.   </macro>
  36370.   <macro name="title">
  36371.     <choose>
  36372.       <if variable="title" match="none">
  36373.         <choose>
  36374.           <if type="personal_communication" match="none">
  36375.         <text variable="genre" text-case="capitalize-first"/>
  36376.           </if>
  36377.         </choose>
  36378.       </if>
  36379.       <else-if type="book">
  36380.         <text variable="title" font-style="italic"/>
  36381.       </else-if>
  36382.       <else>
  36383.         <text variable="title" quotes="true"/>
  36384.       </else>
  36385.     </choose>
  36386.   </macro>
  36387.   <macro name="title-short">
  36388.     <choose>
  36389.       <if variable="title" match="none">
  36390.         <choose>
  36391.           <if type="interview">
  36392.             <text term="interview" text-case="lowercase"/>
  36393.           </if>
  36394.           <else-if type="manuscript speech" match="any">
  36395.             <text variable="genre" form="short"/>
  36396.           </else-if>
  36397.           <else-if type="personal_communication">
  36398.             <text macro="issued"/>
  36399.           </else-if>
  36400.         </choose>
  36401.       </if>
  36402.       <else-if type="book">
  36403.         <text variable="title" form="short" font-style="italic"/>
  36404.       </else-if>
  36405.       <else>
  36406.         <text variable="title" form="short" quotes="true"/>
  36407.       </else>
  36408.     </choose>
  36409.   </macro>
  36410.   <macro name="description-note">
  36411.     <group delimiter=", ">
  36412.       <text macro="interviewer-note"/>
  36413.       <text variable="medium"/>
  36414.       <choose>
  36415.         <if variable="title" match="none"> </if>
  36416.         <else-if type="thesis speech" match="any"> </else-if>
  36417.         <else>
  36418.           <text variable="genre"/>
  36419.         </else>
  36420.       </choose>
  36421.     </group>
  36422.   </macro>
  36423.   <macro name="description">
  36424.     <group delimiter=", ">
  36425.       <group delimiter=". ">
  36426.         <text macro="interviewer"/>
  36427.         <text variable="medium" text-case="capitalize-first"/>
  36428.       </group>
  36429.       <choose>
  36430.         <if variable="title" match="none"> </if>
  36431.         <else-if type="thesis speech" match="any"> </else-if>
  36432.         <else>
  36433.           <text variable="genre" text-case="capitalize-first"/>
  36434.         </else>
  36435.       </choose>
  36436.     </group>
  36437.   </macro>
  36438.   <macro name="container-title-note">
  36439.     <choose>
  36440.       <if type="chapter">
  36441.     <text term="in" text-case="lowercase" suffix=" "/>
  36442.       </if>
  36443.     </choose>
  36444.     <text variable="container-title" font-style="italic"/>
  36445.   </macro>
  36446.   <macro name="container-title">
  36447.     <choose>
  36448.       <if type="chapter">
  36449.     <text term="in" text-case="capitalize-first" suffix=" "/>
  36450.       </if>
  36451.     </choose>
  36452.     <text variable="container-title" font-style="italic"/>
  36453.   </macro>
  36454.   <macro name="collection-title">
  36455.     <text variable="collection-title"/>
  36456.     <text variable="collection-number" prefix=" "/>
  36457.   </macro>
  36458.   <macro name="edition-note">
  36459.     <choose>
  36460.       <if type="book chapter" match="any">
  36461.     <choose>
  36462.       <if is-numeric="edition">
  36463.         <group delimiter=" ">
  36464.           <number variable="edition" form="ordinal"/>
  36465.           <text term="edition" form="short" suffix="."/>
  36466.         </group>
  36467.       </if>
  36468.       <else>
  36469.         <text variable="edition" suffix="."/>
  36470.       </else>
  36471.     </choose>
  36472.       </if>
  36473.     </choose>
  36474.   </macro>
  36475.   <macro name="edition">
  36476.     <choose>
  36477.       <if type="book chapter" match="any">
  36478.     <choose>
  36479.       <if is-numeric="edition">
  36480.         <group delimiter=" ">
  36481.           <number variable="edition" form="ordinal"/>
  36482.           <text term="edition" form="short" suffix="."/>
  36483.         </group>
  36484.       </if>
  36485.       <else>
  36486.         <text variable="edition" text-case="capitalize-first" suffix="."/>
  36487.       </else>
  36488.     </choose>
  36489.       </if>
  36490.     </choose>
  36491.   </macro>
  36492.   <macro name="locators-note">
  36493.     <choose>
  36494.       <if type="article-journal">
  36495.         <text variable="volume" prefix=" "/>
  36496.         <text variable="issue" prefix=", no. "/>
  36497.       </if>
  36498.       <else-if type="book chapter" match="any">
  36499.         <group prefix=", " delimiter=", ">
  36500.           <group>
  36501.             <text term="volume" form="short" suffix=". "/>
  36502.             <number variable="volume" form="numeric"/>
  36503.           </group>
  36504.           <choose>
  36505.             <if variable="locator" match="none">
  36506.           <group>
  36507.             <number variable="number-of-volumes" form="numeric"/>
  36508.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  36509.           </group>
  36510.             </if>
  36511.           </choose>
  36512.           <text macro="edition-note"/>
  36513.         </group>
  36514.       </else-if>
  36515.     </choose>
  36516.   </macro>
  36517.   <macro name="locators">
  36518.     <choose>
  36519.       <if type="article-journal">
  36520.         <text variable="volume" prefix=" "/>
  36521.         <text variable="issue" prefix=", no. "/>
  36522.       </if>
  36523.       <else-if type="book" match="any">
  36524.         <group prefix=". " delimiter=". ">
  36525.           <group>
  36526.             <text term="volume" form="short" text-case="capitalize-first" suffix=". "/>
  36527.             <number variable="volume" form="numeric"/>
  36528.           </group>
  36529.           <group>
  36530.             <number variable="number-of-volumes" form="numeric"/>
  36531.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  36532.           </group>
  36533.           <text macro="edition"/>
  36534.         </group>
  36535.       </else-if>
  36536.     </choose>
  36537.   </macro>
  36538.   <macro name="locators-newspaper">
  36539.     <choose>
  36540.       <if type="article-newspaper">
  36541.         <group delimiter=", ">
  36542.           <group>
  36543.         <text variable="edition" suffix=" "/>
  36544.         <text term="edition" prefix=" "/>
  36545.           </group>
  36546.           <group>
  36547.         <text term="section" form="short" suffix=". "/>
  36548.         <text variable="section"/>
  36549.           </group>
  36550.         </group>
  36551.       </if>
  36552.     </choose>
  36553.   </macro>
  36554.   <macro name="event">
  36555.     <group>
  36556.       <text term="presented at" suffix=" "/>
  36557.       <text variable="event"/>
  36558.     </group>
  36559.   </macro>
  36560.   <macro name="publisher">
  36561.     <group delimiter=": ">
  36562.       <text variable="publisher-place"/>
  36563.       <text variable="publisher"/>
  36564.     </group>
  36565.   </macro>
  36566.   <macro name="issued">
  36567.     <choose>
  36568.       <if type="graphic report" match="any">
  36569.     <date variable="issued">
  36570.       <date-part name="month" suffix=" "/>
  36571.       <date-part name="day" suffix=", "/>
  36572.       <date-part name="year"/>
  36573.     </date>
  36574.       </if>
  36575.       <else-if type="book chapter thesis" match="any">
  36576.     <date variable="issued">
  36577.       <date-part name="year"/>
  36578.     </date>
  36579.       </else-if>
  36580.       <else>
  36581.     <date variable="issued">
  36582.       <date-part name="month" suffix=" "/>
  36583.       <date-part name="day" suffix=", "/>
  36584.       <date-part name="year"/>
  36585.     </date>
  36586.       </else>
  36587.     </choose>
  36588.   </macro>
  36589.   <macro name="point-locators-subsequent">
  36590.     <group>
  36591.       <choose>
  36592.         <if locator="page" match="none">
  36593.       <label variable="locator" form="short" include-period="true" suffix=" "/>
  36594.         </if>
  36595.       </choose>
  36596.       <text variable="locator"/>
  36597.     </group>
  36598.   </macro>
  36599.   <macro name="point-locators">
  36600.     <choose>
  36601.       <if variable="locator" match="none">
  36602.         <text macro="pages"/>
  36603.       </if>
  36604.       <else-if type="article-journal">
  36605.         <text variable="locator" prefix=": "/>
  36606.       </else-if>
  36607.       <else>
  36608.         <text macro="point-locators-subsequent" prefix=", "/>
  36609.       </else>
  36610.     </choose>
  36611.   </macro>
  36612.   <macro name="pages">
  36613.     <choose>
  36614.       <if type="article-journal">
  36615.     <text variable="page" prefix=": "/>
  36616.       </if>
  36617.       <else-if type="chapter">
  36618.     <text variable="page" prefix=", "/>
  36619.       </else-if>
  36620.     </choose>
  36621.   </macro>
  36622.   <macro name="locators-chapter">
  36623.     <choose>
  36624.       <if type="chapter">
  36625.         <text variable="volume" suffix=":"/>
  36626.         <text variable="page"/>
  36627.       </if>
  36628.     </choose>
  36629.   </macro>
  36630.   <macro name="locators-journal">
  36631.     <choose>
  36632.       <if type="article-journal">
  36633.     <text variable="page" prefix=": "/>
  36634.       </if>
  36635.     </choose>
  36636.   </macro>
  36637.   <macro name="archive-note">
  36638.     <group delimiter=", ">
  36639.       <text variable="archive_location"/>
  36640.       <text variable="archive"/>
  36641.       <text variable="archive-place"/>
  36642.     </group>
  36643.   </macro>
  36644.   <macro name="archive">
  36645.     <group delimiter=". ">
  36646.       <text variable="archive_location" text-case="capitalize-first"/>
  36647.       <text variable="archive"/>
  36648.       <text variable="archive-place"/>
  36649.     </group>
  36650.   </macro>
  36651.   <macro name="issue-note">
  36652.     <choose>
  36653.       <if type="article-journal">
  36654.         <text macro="issued" prefix=" (" suffix=")"/>
  36655.       </if>
  36656.       <else-if variable="publisher-place publisher" match="any">
  36657.         <group prefix=" (" suffix=")" delimiter=", ">
  36658.           <group delimiter=" ">
  36659.             <choose>
  36660.               <if variable="title" match="none"> </if>
  36661.               <else-if type="thesis speech" match="any">
  36662.                 <text variable="genre"/>
  36663.               </else-if>
  36664.             </choose>
  36665.             <text macro="event"/>
  36666.           </group>
  36667.           <text macro="publisher"/>
  36668.           <text macro="issued"/>
  36669.         </group>
  36670.       </else-if>
  36671.       <else>
  36672.         <text macro="issued" prefix=", "/>
  36673.       </else>
  36674.     </choose>
  36675.   </macro>
  36676.   <macro name="issue">
  36677.     <choose>
  36678.       <if type="article-journal">
  36679.         <text macro="issued" prefix=" (" suffix=")"/>
  36680.       </if>
  36681.       <else-if type="speech">
  36682.         <choose>
  36683.           <if variable="title" match="none"> </if>
  36684.           <else>
  36685.             <text variable="genre" text-case="capitalize-first" prefix=". "/>
  36686.           </else>
  36687.         </choose>
  36688.         <text macro="event" prefix=" "/>
  36689.         <text variable="event-place" prefix=", "/>
  36690.         <text macro="issued" prefix=", "/>
  36691.       </else-if>
  36692.       <else-if variable="publisher-place publisher" match="any">
  36693.         <group prefix=". " delimiter=", ">
  36694.           <choose>
  36695.             <if type="thesis">
  36696.               <text variable="genre" text-case="capitalize-first"/>
  36697.             </if>
  36698.           </choose>
  36699.           <text macro="publisher"/>
  36700.           <text macro="issued"/>
  36701.         </group>
  36702.       </else-if>
  36703.       <else>
  36704.         <text macro="issued" prefix=", "/>
  36705.       </else>
  36706.     </choose>
  36707.   </macro>
  36708.   <macro name="access-note">
  36709.     <group delimiter=", ">
  36710.       <choose>
  36711.         <if type="graphic report" match="any">
  36712.       <text macro="archive-note"/>
  36713.         </if>
  36714.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  36715.       <text macro="archive-note"/>
  36716.         </else-if>
  36717.       </choose>
  36718.       <text variable="DOI" prefix="doi:"/>
  36719.       <text variable="URL"/>
  36720.     </group>
  36721.   </macro>
  36722.   <macro name="access">
  36723.     <group delimiter=". ">
  36724.       <choose>
  36725.         <if type="graphic report" match="any">
  36726.       <text macro="archive"/>
  36727.         </if>
  36728.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  36729.       <text macro="archive"/>
  36730.         </else-if>
  36731.       </choose>
  36732.       <text variable="URL"/>
  36733.     </group>
  36734.   </macro>
  36735.   <macro name="sort-key">
  36736.       <text macro="contributors-sort" suffix=" "/>
  36737.       <text variable="title" suffix=" "/>
  36738.       <text variable="genre"/>
  36739.   </macro>
  36740.   <citation>
  36741.     <option name="et-al-min" value="4"/>
  36742.     <option name="et-al-use-first" value="1"/>
  36743.     <option name="et-al-subsequent-min" value="4"/>
  36744.     <option name="et-al-subsequent-use-first" value="1"/>
  36745.     <option name="disambiguate-add-names" value="true"/>
  36746.     <layout prefix="" suffix="." delimiter="; ">
  36747.       <choose>
  36748.         <if position="ibid-with-locator">
  36749.           <group delimiter=", ">
  36750.             <text term="ibid" text-case="capitalize-first" suffix="."/>
  36751.             <text macro="point-locators-subsequent"/>
  36752.           </group>
  36753.         </if>
  36754.         <else-if position="ibid">
  36755.           <text term="ibid" text-case="capitalize-first" suffix="."/>
  36756.         </else-if>
  36757.         <else-if position="subsequent">
  36758.           <group delimiter=", ">
  36759.             <text macro="contributors-short"/>
  36760.             <text macro="title-short"/>
  36761.             <text macro="point-locators-subsequent"/>
  36762.           </group>
  36763.         </else-if>
  36764.         <else>
  36765.           <group delimiter=", ">
  36766.             <text macro="contributors-note"/>
  36767.             <text macro="title-note"/>
  36768.             <text macro="description-note"/>
  36769.             <text macro="secondary-contributors-note"/>
  36770.             <text macro="container-title-note"/>
  36771.             <text macro="container-contributors-note"/>
  36772.           </group>
  36773.           <text macro="locators-note"/>
  36774.           <text macro="collection-title" prefix=", "/>
  36775.           <text macro="issue-note"/>
  36776.           <text macro="locators-newspaper" prefix=", "/>
  36777.           <text macro="point-locators"/>
  36778.           <text macro="access-note" prefix=", "/>
  36779.         </else>
  36780.       </choose>
  36781.     </layout>
  36782.   </citation> 
  36783.   <bibliography>
  36784.     <option name="hanging-indent" value="true"/>
  36785.     <option name="et-al-min" value="11"/>
  36786.     <option name="et-al-use-first" value="7"/>
  36787.     <option name="subsequent-author-substitute" value="---"/>
  36788.     <option name="entry-spacing" value="0"/>
  36789.     <sort>
  36790.       <key macro="sort-key"/>
  36791.       <key variable="issued"/>
  36792.     </sort>
  36793.     <layout suffix=".">
  36794.       <group delimiter=". ">
  36795.         <text macro="contributors"/>
  36796.         <text macro="title"/>
  36797.         <text macro="description"/>
  36798.         <text macro="secondary-contributors"/>
  36799.         <group delimiter=", ">
  36800.           <text macro="container-title"/>
  36801.           <text macro="container-contributors"/>
  36802.           <text macro="locators-chapter"/>
  36803.         </group>
  36804.       </group>
  36805.       <text macro="locators"/>
  36806.       <text macro="collection-title" prefix=". "/>
  36807.       <text macro="issue"/>
  36808.       <text macro="locators-newspaper" prefix=", "/>
  36809.       <text macro="locators-journal"/>
  36810.       <text macro="access" prefix=". "/>
  36811.     </layout>
  36812.   </bibliography>
  36813. </style>
  36814. ');
  36815.  
  36816. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-note-bibliography', '2008-11-16 18:00:00', 'Chicago Manual of Style (Note with Bibliography)',
  36817. '<?xml version="1.0" encoding="UTF-8"?>
  36818. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  36819. <style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en"> 
  36820.   <info>
  36821.     <title>Chicago Manual of Style (Note with Bibliography)</title>
  36822.     <id>http://www.zotero.org/styles/chicago-note-bibliography</id>
  36823.     <link href="http://www.zotero.org/styles/chicago-note-bibliography"/>
  36824.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  36825.     <author>
  36826.       <name>Julian Onions</name>
  36827.       <email>julian.onions@gmail.com</email>
  36828.     </author>
  36829.     <contributor>
  36830.       <name>Simon Kornblith</name>
  36831.       <email>simon@simonster.com</email> 
  36832.     </contributor>
  36833.     <contributor>
  36834.       <name>Elena Razlogova</name>
  36835.       <email>elena.razlogova@gmail.com</email> 
  36836.     </contributor>
  36837.     <summary>Chicago format with short notes and full bibliography</summary>
  36838.     <category term="generic-base"/>
  36839.     <category term="numeric"/>
  36840.     <updated>2008-11-16T18:00:00+00:00</updated>
  36841.   </info>
  36842.   <macro name="secondary-contributors">
  36843.     <choose>
  36844.       <if type="chapter" match="none">
  36845.     <group delimiter=". ">
  36846.       <choose>
  36847.         <if variable="author">
  36848.       <names variable="editor" delimiter=". ">
  36849.         <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  36850.         <name and="text" delimiter=", "/>
  36851.       </names>
  36852.         </if>
  36853.       </choose>
  36854.       <choose>
  36855.         <if variable="author editor" match="any">
  36856.       <names variable="translator" delimiter=". ">
  36857.         <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  36858.         <name and="text" delimiter=", "/>
  36859.       </names>
  36860.         </if>
  36861.       </choose>
  36862.     </group>
  36863.       </if>
  36864.     </choose>
  36865.   </macro>
  36866.   <macro name="container-contributors">
  36867.     <choose>
  36868.       <if type="chapter">
  36869.     <group delimiter=", ">
  36870.       <choose>
  36871.         <if variable="author">
  36872.       <names variable="editor" delimiter=", ">
  36873.         <label form="verb" text-case="lowercase" suffix=" "/>
  36874.         <name and="text" delimiter=", "/>
  36875.       </names>
  36876.         </if>
  36877.       </choose>
  36878.       <choose>
  36879.         <if variable="author editor" match="any">
  36880.       <names variable="translator" delimiter=", ">
  36881.         <label form="verb" text-case="lowercase" suffix=" "/>
  36882.         <name and="text" delimiter=", "/>
  36883.       </names>
  36884.         </if>
  36885.       </choose>
  36886.     </group>
  36887.       </if>
  36888.     </choose>
  36889.   </macro>
  36890.   <macro name="editor">
  36891.     <names variable="editor">
  36892.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  36893.       <label form="short" prefix=", " suffix="."/>
  36894.     </names>
  36895.   </macro>
  36896.   <macro name="translator">
  36897.     <names variable="translator">
  36898.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  36899.       <label form="verb-short" prefix=", " suffix="."/>
  36900.     </names>
  36901.   </macro>
  36902.   <macro name="recipient-note">
  36903.     <names variable="recipient" delimiter=", ">
  36904.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  36905.       <name and="text" delimiter=", "/>
  36906.     </names>
  36907.   </macro>
  36908.   <macro name="recipient">
  36909.     <choose>
  36910.       <if type="personal_communication">
  36911.         <choose>
  36912.             <if variable="genre">
  36913.         <text variable="genre" text-case="capitalize-first"/>
  36914.             </if>
  36915.             <else>
  36916.         <text term="letter" text-case="capitalize-first"/>
  36917.           </else>
  36918.         </choose>
  36919.       </if>
  36920.     </choose>
  36921.     <text macro="recipient-note" prefix=" "/>
  36922.   </macro>
  36923.   <macro name="contributors">
  36924.     <names variable="author">
  36925.       <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
  36926.       <substitute>
  36927.     <text macro="editor"/>
  36928.     <text macro="translator"/>
  36929.       </substitute>
  36930.     </names>
  36931.     <text macro="recipient" prefix=". "/>
  36932.   </macro>
  36933.   <macro name="recipient-short">
  36934.     <names variable="recipient"> 
  36935.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  36936.       <name form="short" and="text" delimiter=", " />
  36937.     </names>
  36938.   </macro>
  36939.   <macro name="contributors-short">
  36940.     <names variable="author">
  36941.       <name form="short" and="text" delimiter=", " />
  36942.       <substitute>
  36943.     <names variable="editor"/>
  36944.     <names variable="translator"/>
  36945.       </substitute>
  36946.     </names>
  36947.     <text macro="recipient-short"/>
  36948.   </macro>
  36949.   <macro name="contributors-sort">
  36950.     <names variable="author">
  36951.       <name name-as-sort-order="all" and="text" sort-separator=", "
  36952.         delimiter=", " delimiter-precedes-last="always"/>
  36953.       <label form="verb-short" prefix=", " suffix="."/>
  36954.       <substitute>
  36955.     <names variable="editor"/>
  36956.     <names variable="translator"/>
  36957.       </substitute>
  36958.     </names>
  36959.   </macro>
  36960.   <macro name="interviewer">
  36961.     <names variable="interviewer" delimiter=", ">
  36962.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  36963.       <name and="text" delimiter=", "/>
  36964.     </names>
  36965.   </macro>
  36966.   <macro name="title">
  36967.     <choose>
  36968.       <if variable="title" match="none">
  36969.         <choose>
  36970.           <if type="personal_communication" match="none">
  36971.         <text variable="genre" text-case="capitalize-first"/>
  36972.           </if>
  36973.         </choose>
  36974.       </if>
  36975.       <else-if type="book">
  36976.         <text variable="title" font-style="italic"/>
  36977.       </else-if>
  36978.       <else>
  36979.         <text variable="title" quotes="true"/>
  36980.       </else>
  36981.     </choose>
  36982.   </macro>
  36983.   <macro name="title-short">
  36984.     <choose>
  36985.       <if variable="title" match="none">
  36986.         <choose>
  36987.           <if type="interview">
  36988.             <text term="interview" text-case="lowercase"/>
  36989.           </if>
  36990.           <else-if type="manuscript speech" match="any">
  36991.             <text variable="genre" form="short"/>
  36992.           </else-if>
  36993.           <else-if type="personal_communication">
  36994.             <text macro="issued"/>
  36995.           </else-if>
  36996.         </choose>
  36997.       </if>
  36998.       <else-if type="book">
  36999.         <text variable="title" form="short" font-style="italic"/>
  37000.       </else-if>
  37001.       <else>
  37002.         <text variable="title" form="short" quotes="true"/>
  37003.       </else>
  37004.     </choose>
  37005.   </macro>
  37006.   <macro name="description">
  37007.     <group delimiter=", ">
  37008.       <group delimiter=". ">
  37009.         <text macro="interviewer"/>
  37010.         <text variable="medium" text-case="capitalize-first"/>
  37011.       </group>
  37012.       <choose>
  37013.         <if variable="title" match="none"> </if>
  37014.         <else-if type="thesis speech" match="any"> </else-if>
  37015.         <else>
  37016.           <text variable="genre" text-case="capitalize-first"/>
  37017.         </else>
  37018.       </choose>
  37019.     </group>
  37020.   </macro>
  37021.   <macro name="container-title">
  37022.     <choose>
  37023.       <if type="chapter">
  37024.     <text term="in" text-case="capitalize-first" suffix=" "/>
  37025.       </if>
  37026.     </choose>
  37027.     <text variable="container-title" font-style="italic"/>
  37028.   </macro>
  37029.   <macro name="edition">
  37030.     <choose>
  37031.       <if type="book chapter" match="any">
  37032.     <choose>
  37033.       <if is-numeric="edition">
  37034.         <group delimiter=" ">
  37035.           <number variable="edition" form="ordinal"/>
  37036.           <text term="edition" form="short" suffix="."/>
  37037.         </group>
  37038.       </if>
  37039.       <else>
  37040.         <text variable="edition" text-case="capitalize-first" suffix="."/>
  37041.       </else>
  37042.     </choose>
  37043.       </if>
  37044.     </choose>
  37045.   </macro>
  37046.   <macro name="collection-title">
  37047.     <text variable="collection-title"/>
  37048.     <text variable="collection-number" prefix=" "/>
  37049.   </macro>
  37050.   <macro name="locators">
  37051.     <choose>
  37052.       <if type="article-journal">
  37053.         <text variable="volume" prefix=" "/>
  37054.         <text variable="issue" prefix=", no. "/>
  37055.       </if>
  37056.       <else-if type="book">
  37057.         <group prefix=". " delimiter=". ">
  37058.           <group>
  37059.             <text term="volume" form="short" text-case="capitalize-first" suffix=". "/>
  37060.             <number variable="volume" form="numeric"/>
  37061.           </group>
  37062.           <group>
  37063.             <number variable="number-of-volumes" form="numeric"/>
  37064.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  37065.           </group>
  37066.           <text macro="edition"/>
  37067.         </group>
  37068.       </else-if>
  37069.     </choose>
  37070.   </macro>
  37071.   <macro name="locators-newspaper">
  37072.     <choose>
  37073.       <if type="article-newspaper">
  37074.         <group delimiter=", ">
  37075.           <group>
  37076.         <text variable="edition" suffix=" "/>
  37077.         <text term="edition" prefix=" "/>
  37078.           </group>
  37079.           <group>
  37080.         <text term="section" form="short" suffix=". "/>
  37081.         <text variable="section"/>
  37082.           </group>
  37083.         </group>
  37084.       </if>
  37085.     </choose>
  37086.   </macro>
  37087.   <macro name="event">
  37088.     <group>
  37089.       <text term="presented at" suffix=" "/>
  37090.       <text variable="event"/>
  37091.     </group>
  37092.   </macro>
  37093.   <macro name="publisher">
  37094.     <group delimiter=": ">
  37095.       <text variable="publisher-place"/>
  37096.       <text variable="publisher"/>
  37097.     </group>
  37098.   </macro>
  37099.   <macro name="issued">
  37100.     <choose>
  37101.       <if type="graphic report" match="any">
  37102.     <date variable="issued">
  37103.       <date-part name="month" suffix=" "/>
  37104.       <date-part name="day" suffix=", "/>
  37105.       <date-part name="year"/>
  37106.     </date>
  37107.       </if>
  37108.       <else-if type="book chapter thesis" match="any">
  37109.     <date variable="issued">
  37110.       <date-part name="year"/>
  37111.     </date>
  37112.       </else-if>
  37113.       <else>
  37114.     <date variable="issued">
  37115.       <date-part name="month" suffix=" "/>
  37116.       <date-part name="day" suffix=", "/>
  37117.       <date-part name="year"/>
  37118.     </date>
  37119.       </else>
  37120.     </choose>
  37121.   </macro>
  37122.   <macro name="pages-chapter">
  37123.     <choose>
  37124.       <if type="chapter">
  37125.         <text variable="volume" suffix=":"/>
  37126.         <text variable="page"/>
  37127.       </if>
  37128.     </choose>
  37129.   </macro>
  37130.   <macro name="pages-article">
  37131.     <choose>
  37132.       <if type="article-journal">
  37133.     <text variable="page" prefix=": "/>
  37134.       </if>
  37135.     </choose>
  37136.   </macro>
  37137.   <macro name="point-locators-subsequent">
  37138.     <group>
  37139.       <choose>
  37140.         <if locator="page" match="none">
  37141.       <label variable="locator" form="short" include-period="true" suffix=" "/>
  37142.         </if>
  37143.       </choose>
  37144.       <text variable="locator"/>
  37145.     </group>
  37146.   </macro>
  37147.   <macro name="archive">
  37148.     <group delimiter=". ">
  37149.       <text variable="archive_location" text-case="capitalize-first"/>
  37150.       <text variable="archive"/>
  37151.       <text variable="archive-place"/>
  37152.     </group>
  37153.   </macro>
  37154.   <macro name="issue">
  37155.     <choose>
  37156.       <if type="article-journal">
  37157.         <text macro="issued" prefix=" (" suffix=")"/>
  37158.       </if>
  37159.       <else-if type="speech">
  37160.         <choose>
  37161.           <if variable="title" match="none"> </if>
  37162.           <else>
  37163.             <text variable="genre" text-case="capitalize-first" prefix=". "/>
  37164.           </else>
  37165.         </choose>
  37166.         <text macro="event" prefix=" "/>
  37167.         <text variable="event-place" prefix=", "/>
  37168.         <text macro="issued" prefix=", "/>
  37169.       </else-if>
  37170.       <else-if variable="publisher-place publisher" match="any">
  37171.         <group prefix=". " delimiter=", ">
  37172.           <choose>
  37173.             <if type="thesis">
  37174.               <text variable="genre" text-case="capitalize-first"/>
  37175.             </if>
  37176.           </choose>
  37177.           <text macro="publisher"/>
  37178.           <text macro="issued"/>
  37179.         </group>
  37180.       </else-if>
  37181.       <else>
  37182.         <text macro="issued" prefix=", "/>
  37183.       </else>
  37184.     </choose>
  37185.   </macro>
  37186.   <macro name="access">
  37187.     <group delimiter=". ">
  37188.       <choose>
  37189.         <if type="graphic report" match="any">
  37190.       <text macro="archive"/>
  37191.         </if>
  37192.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  37193.       <text macro="archive"/>
  37194.         </else-if>
  37195.       </choose>
  37196.       <text variable="DOI" prefix="doi:"/>
  37197.       <text variable="URL"/>
  37198.     </group>
  37199.   </macro>
  37200.   <macro name="sort-key">
  37201.       <text macro="contributors-sort" suffix=" "/>
  37202.       <text variable="title" suffix=" "/>
  37203.       <text variable="genre"/>
  37204.   </macro>
  37205.   <citation>
  37206.     <option name="et-al-min" value="4"/>
  37207.     <option name="et-al-use-first" value="1"/>
  37208.     <option name="et-al-subsequent-min" value="4"/>
  37209.     <option name="et-al-subsequent-use-first" value="1"/>
  37210.     <option name="disambiguate-add-names" value="true"/>
  37211.     <layout prefix="" suffix="." delimiter="; ">
  37212.       <choose>
  37213.         <if position="ibid-with-locator">
  37214.           <group delimiter=", ">
  37215.             <text term="ibid" text-case="capitalize-first" suffix="."/>
  37216.             <text macro="point-locators-subsequent"/>
  37217.           </group>
  37218.         </if>
  37219.         <else-if position="ibid">
  37220.           <text term="ibid" text-case="capitalize-first" suffix="."/>
  37221.         </else-if>
  37222.         <else>
  37223.           <group delimiter=", ">
  37224.             <text macro="contributors-short"/>
  37225.             <text macro="title-short"/>
  37226.             <text macro="point-locators-subsequent"/>
  37227.           </group>
  37228.         </else>
  37229.       </choose>
  37230.     </layout>
  37231.   </citation> 
  37232.   <bibliography>
  37233.     <option name="hanging-indent" value="true"/>
  37234.     <option name="et-al-min" value="11"/>
  37235.     <option name="et-al-use-first" value="7"/>
  37236.     <option name="subsequent-author-substitute" value="---"/>
  37237.     <option name="entry-spacing" value="0"/>
  37238.     <sort>
  37239.       <key macro="sort-key"/>
  37240.       <key variable="issued"/>
  37241.     </sort>
  37242.     <layout suffix=".">
  37243.       <group delimiter=". ">
  37244.         <text macro="contributors"/>
  37245.         <text macro="title"/>
  37246.         <text macro="description"/>
  37247.         <text macro="secondary-contributors"/>
  37248.         <group delimiter=", ">
  37249.           <text macro="container-title"/>
  37250.           <text macro="container-contributors"/>
  37251.           <text macro="pages-chapter"/>
  37252.         </group>
  37253.       </group>
  37254.       <text macro="locators"/>
  37255.       <text macro="collection-title" prefix=". "/>
  37256.       <text macro="issue"/>
  37257.       <text macro="locators-newspaper" prefix=", "/>
  37258.       <text macro="pages-article"/>
  37259.       <text macro="access" prefix=". "/>
  37260.     </layout>
  37261.   </bibliography>
  37262. </style>
  37263. ');
  37264.  
  37265. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-note', '2008-11-16 18:00:00', 'Chicago Manual of Style (Note without Bibliography)',
  37266. '<?xml version="1.0" encoding="UTF-8"?>
  37267. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  37268. <style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en">
  37269.   <info>
  37270.     <title>Chicago Manual of Style (Note without Bibliography)</title>
  37271.     <id>http://www.zotero.org/styles/chicago-note</id>
  37272.     <link href="http://www.zotero.org/styles/chicago-note"/>
  37273.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  37274.     <author>
  37275.       <name>Julian Onions</name>
  37276.       <email>julian.onions@gmail.com</email>
  37277.     </author>
  37278.     <contributor>
  37279.       <name>Simon Kornblith</name>
  37280.       <email>simon@simonster.com</email>
  37281.     </contributor>
  37282.     <contributor>
  37283.       <name>Elena Razlogova</name>
  37284.       <email>elena.razlogova@gmail.com</email>
  37285.     </contributor>
  37286.     <summary>Chicago format with full notes and no bibliography</summary>
  37287.     <category term="generic-base"/>
  37288.     <category term="note"/>
  37289.     <updated>2008-11-16T18:00:00+00:00</updated>
  37290.   </info>
  37291.   <macro name="editor-translator">
  37292.     <group delimiter=", ">
  37293.       <choose>
  37294.         <if variable="author">
  37295.       <names variable="editor" delimiter=", ">
  37296.         <label form="verb-short" text-case="lowercase" suffix=". "/>
  37297.         <name and="text" delimiter=", "/>
  37298.       </names>
  37299.         </if>
  37300.       </choose>
  37301.       <choose>
  37302.         <if variable="author editor" match="any">
  37303.       <names variable="translator" delimiter=", ">
  37304.         <label form="verb-short" text-case="lowercase" suffix=". "/>
  37305.         <name and="text" delimiter=", "/>
  37306.       </names>
  37307.         </if>
  37308.       </choose>
  37309.     </group>
  37310.   </macro>
  37311.   <macro name="secondary-contributors-note">
  37312.     <choose>
  37313.       <if type="chapter" match="none">
  37314.         <text macro="editor-translator"/>
  37315.       </if>
  37316.     </choose>
  37317.   </macro>
  37318.   <macro name="container-contributors-note">
  37319.     <choose>
  37320.       <if type="chapter">
  37321.         <text macro="editor-translator"/>
  37322.       </if>
  37323.     </choose>
  37324.   </macro>
  37325.   <macro name="editor-note">
  37326.     <names variable="editor">
  37327.       <name and="text" sort-separator=", " delimiter=", "/>
  37328.       <label form="short" prefix=", " suffix="."/>
  37329.     </names>
  37330.   </macro>
  37331.   <macro name="translator-note">
  37332.     <names variable="translator">
  37333.       <name and="text" sort-separator=", " delimiter=", "/>
  37334.       <label form="verb-short" prefix=", " suffix="."/>
  37335.     </names>
  37336.   </macro>
  37337.   <macro name="recipient-note">
  37338.     <names variable="recipient" delimiter=", ">
  37339.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  37340.       <name and="text" delimiter=", "/>
  37341.     </names>
  37342.   </macro>
  37343.   <macro name="contributors-note">
  37344.     <names variable="author">
  37345.       <name and="text" sort-separator=", " delimiter=", "/>
  37346.       <substitute>
  37347.     <text macro="editor-note"/>
  37348.     <text macro="translator-note"/>
  37349.       </substitute>
  37350.     </names>
  37351.     <text macro="recipient-note"/>
  37352.   </macro>
  37353.   <macro name="recipient-short">
  37354.     <names variable="recipient">
  37355.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  37356.       <name form="short" and="text" delimiter=", "/>
  37357.     </names>
  37358.   </macro>
  37359.   <macro name="contributors-short">
  37360.     <names variable="author">
  37361.       <name form="short" and="text" delimiter=", "/>
  37362.       <substitute>
  37363.         <names variable="editor"/>
  37364.         <names variable="translator"/>
  37365.       </substitute>
  37366.     </names>
  37367.     <text macro="recipient-short"/>
  37368.   </macro>
  37369.   <macro name="interviewer-note">
  37370.     <names variable="interviewer" delimiter=", ">
  37371.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  37372.       <name and="text" delimiter=", "/>
  37373.     </names>
  37374.   </macro>
  37375.   <macro name="title-note">
  37376.     <choose>
  37377.       <if variable="title" match="none">
  37378.         <text variable="genre"/>
  37379.       </if>
  37380.       <else-if type="book">
  37381.         <text variable="title" font-style="italic"/>
  37382.       </else-if>
  37383.       <else>
  37384.         <text variable="title" quotes="true"/>
  37385.       </else>
  37386.     </choose>
  37387.   </macro>
  37388.   <macro name="title-short">
  37389.     <choose>
  37390.       <if variable="title" match="none">
  37391.         <choose>
  37392.           <if type="interview">
  37393.             <text term="interview" text-case="lowercase"/>
  37394.           </if>
  37395.           <else-if type="manuscript speech" match="any">
  37396.             <text variable="genre" form="short"/>
  37397.           </else-if>
  37398.           <else-if type="personal_communication">
  37399.             <text macro="issued"/>
  37400.           </else-if>
  37401.         </choose>
  37402.       </if>
  37403.       <else-if type="book">
  37404.         <text variable="title" form="short" font-style="italic"/>
  37405.       </else-if>
  37406.       <else>
  37407.         <text variable="title" form="short" quotes="true"/>
  37408.       </else>
  37409.     </choose>
  37410.   </macro>
  37411.   <macro name="description-note">
  37412.     <group delimiter=", ">
  37413.       <text macro="interviewer-note"/>
  37414.       <text variable="medium"/>
  37415.       <choose>
  37416.         <if variable="title" match="none"> </if>
  37417.         <else-if type="thesis speech" match="any"> </else-if>
  37418.         <else>
  37419.           <text variable="genre"/>
  37420.         </else>
  37421.       </choose>
  37422.     </group>
  37423.   </macro>
  37424.   <macro name="container-title-note">
  37425.     <choose>
  37426.       <if type="chapter">
  37427.     <text term="in" text-case="lowercase" suffix=" "/>
  37428.       </if>
  37429.     </choose>
  37430.     <text variable="container-title" font-style="italic"/>
  37431.   </macro>
  37432.   <macro name="edition-note">
  37433.     <choose>
  37434.       <if type="book chapter" match="any">
  37435.     <choose>
  37436.       <if is-numeric="edition">
  37437.         <group delimiter=" ">
  37438.           <number variable="edition" form="ordinal"/>
  37439.           <text term="edition" form="short" suffix="."/>
  37440.         </group>
  37441.       </if>
  37442.       <else>
  37443.         <text variable="edition" suffix="."/>
  37444.       </else>
  37445.     </choose>
  37446.       </if>
  37447.     </choose>
  37448.   </macro>
  37449.   <macro name="collection-title">
  37450.     <text variable="collection-title"/>
  37451.     <text variable="collection-number" prefix=" "/>
  37452.   </macro>
  37453.   <macro name="locators-note">
  37454.     <choose>
  37455.       <if type="article-journal">
  37456.         <text variable="volume" prefix=" "/>
  37457.         <text variable="issue" prefix=", no. "/>
  37458.       </if>
  37459.       <else-if type="book chapter" match="any">
  37460.         <group prefix=", " delimiter=", ">
  37461.           <group>
  37462.             <text term="volume" form="short" suffix=". "/>
  37463.             <number variable="volume" form="numeric"/>
  37464.           </group>
  37465.           <choose>
  37466.             <if variable="locator" match="none">
  37467.           <group>
  37468.             <number variable="number-of-volumes" form="numeric"/>
  37469.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  37470.           </group>
  37471.             </if>
  37472.           </choose>
  37473.           <text macro="edition-note"/>
  37474.         </group>
  37475.       </else-if>
  37476.     </choose>
  37477.   </macro>
  37478.   <macro name="locators-newspaper">
  37479.     <choose>
  37480.       <if type="article-newspaper">
  37481.         <group delimiter=", ">
  37482.           <group>
  37483.         <text variable="edition" suffix=" "/>
  37484.         <text term="edition" prefix=" "/>
  37485.           </group>
  37486.           <group>
  37487.         <text term="section" form="short" suffix=". "/>
  37488.         <text variable="section"/>
  37489.           </group>
  37490.         </group>
  37491.       </if>
  37492.     </choose>
  37493.   </macro>
  37494.   <macro name="event">
  37495.     <group>
  37496.       <text term="presented at" suffix=" "/>
  37497.       <text variable="event"/>
  37498.     </group>
  37499.   </macro>
  37500.   <macro name="publisher">
  37501.     <group delimiter=": ">
  37502.       <text variable="publisher-place"/>
  37503.       <text variable="publisher"/>
  37504.     </group>
  37505.   </macro>
  37506.   <macro name="issued">
  37507.     <choose>
  37508.       <if type="graphic report" match="any">
  37509.         <date variable="issued">
  37510.           <date-part name="month" suffix=" "/>
  37511.           <date-part name="day" suffix=", "/>
  37512.           <date-part name="year"/>
  37513.         </date>
  37514.       </if>
  37515.       <else-if type="book chapter thesis" match="any">
  37516.         <date variable="issued">
  37517.           <date-part name="year"/>
  37518.         </date>
  37519.       </else-if>
  37520.       <else>
  37521.         <date variable="issued">
  37522.           <date-part name="month" suffix=" "/>
  37523.           <date-part name="day" suffix=", "/>
  37524.           <date-part name="year"/>
  37525.         </date>
  37526.       </else>
  37527.     </choose>
  37528.   </macro>
  37529.   <macro name="pages">
  37530.     <choose>
  37531.       <if type="article-journal">
  37532.     <text variable="page" prefix=": "/>
  37533.       </if>
  37534.       <else-if type="chapter">
  37535.     <text variable="page" prefix=", "/>
  37536.       </else-if>
  37537.     </choose>
  37538.   </macro>
  37539.   <macro name="point-locators-subsequent">
  37540.     <group>
  37541.       <choose>
  37542.         <if locator="page" match="none">
  37543.       <label variable="locator" form="short" include-period="true" suffix=" "/>
  37544.         </if>
  37545.       </choose>
  37546.       <text variable="locator"/>
  37547.     </group>
  37548.   </macro>
  37549.   <macro name="point-locators">
  37550.     <choose>
  37551.       <if variable="locator" match="none">
  37552.         <text macro="pages"/>
  37553.       </if>
  37554.       <else-if type="article-journal">
  37555.         <text variable="locator" prefix=": "/>
  37556.       </else-if>
  37557.       <else>
  37558.         <text macro="point-locators-subsequent" prefix=", "/>
  37559.       </else>
  37560.     </choose>
  37561.   </macro>
  37562.   <macro name="archive-note">
  37563.     <group delimiter=", ">
  37564.       <text variable="archive_location"/>
  37565.       <text variable="archive"/>
  37566.       <text variable="archive-place"/>
  37567.     </group>
  37568.   </macro>
  37569.   <macro name="issue-note">
  37570.     <choose>
  37571.       <if type="article-journal">
  37572.         <text macro="issued" prefix=" (" suffix=")"/>
  37573.       </if>
  37574.       <else-if variable="publisher-place publisher" match="any">
  37575.         <group prefix=" (" suffix=")" delimiter=", ">
  37576.           <group delimiter=" ">
  37577.             <choose>
  37578.               <if variable="title" match="none"> </if>
  37579.               <else-if type="thesis speech" match="any">
  37580.                 <text variable="genre"/>
  37581.               </else-if>
  37582.             </choose>
  37583.             <text macro="event"/>
  37584.           </group>
  37585.           <text macro="publisher"/>
  37586.           <text macro="issued"/>
  37587.         </group>
  37588.       </else-if>
  37589.       <else>
  37590.         <text macro="issued" prefix=", "/>
  37591.       </else>
  37592.     </choose>
  37593.   </macro>
  37594.   <macro name="access-note">
  37595.     <group delimiter=", ">
  37596.       <choose>
  37597.         <if type="graphic report" match="any">
  37598.       <text macro="archive-note"/>
  37599.         </if>
  37600.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  37601.       <text macro="archive-note"/>
  37602.         </else-if>
  37603.       </choose>
  37604.       <text variable="DOI" prefix="doi:"/>
  37605.       <text variable="URL"/>
  37606.     </group>
  37607.   </macro>
  37608.   <citation>
  37609.     <option name="et-al-min" value="4"/>
  37610.     <option name="et-al-use-first" value="1"/>
  37611.     <option name="et-al-subsequent-min" value="4"/>
  37612.     <option name="et-al-subsequent-use-first" value="1"/>
  37613.     <option name="disambiguate-add-names" value="true"/>
  37614.     <option name="disambiguate-add-givenname" value="true"/>
  37615.     <layout prefix="" suffix="." delimiter="; ">
  37616.       <choose>
  37617.         <if position="ibid-with-locator">
  37618.           <group delimiter=", ">
  37619.             <text term="ibid" text-case="capitalize-first" suffix="."/>
  37620.             <text macro="point-locators-subsequent"/>
  37621.           </group>
  37622.         </if>
  37623.         <else-if position="ibid">
  37624.           <text term="ibid" text-case="capitalize-first" suffix="."/>
  37625.         </else-if>
  37626.         <else-if position="subsequent">
  37627.           <group delimiter=", ">
  37628.             <text macro="contributors-short"/>
  37629.             <text macro="title-short"/>
  37630.             <text macro="point-locators-subsequent"/>
  37631.           </group>
  37632.         </else-if>
  37633.         <else>
  37634.           <group delimiter=", ">
  37635.             <text macro="contributors-note"/>
  37636.             <text macro="title-note"/>
  37637.             <text macro="description-note"/>
  37638.             <text macro="secondary-contributors-note"/>
  37639.             <text macro="container-title-note"/>
  37640.             <text macro="container-contributors-note"/>
  37641.           </group>
  37642.           <text macro="locators-note"/>
  37643.           <text macro="collection-title" prefix=", "/>
  37644.           <text macro="issue-note"/>
  37645.           <text macro="locators-newspaper" prefix=", "/>
  37646.           <text macro="point-locators"/>
  37647.           <text macro="access-note" prefix=", "/>
  37648.         </else>
  37649.       </choose>
  37650.     </layout>
  37651.   </citation>
  37652. </style>
  37653. ');
  37654.  
  37655. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/ieee', '2008-11-16 18:00:00', 'IEEE',
  37656. '<?xml version="1.0" encoding="UTF-8"?>
  37657. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  37658. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  37659.   <info>
  37660.     <title>IEEE</title>
  37661.     <id>http://www.zotero.org/styles/ieee</id>
  37662.     <link href="http://www.zotero.org/styles/ieee"/>
  37663.     <author>
  37664.       <name>Michael Berkowitz</name>
  37665.       <email>mberkowi@gmu.edu</email>
  37666.     </author>
  37667.     <contributor>
  37668.       <name>Julian Onions</name>
  37669.       <email>julian.onions@gmail.com</email>
  37670.     </contributor>
  37671.     <contributor>
  37672.       <name>Rintze Zelle</name>
  37673.       <uri>http://forums.zotero.org/account/831/</uri>
  37674.     </contributor>
  37675.     <category term="engineering"/>
  37676.     <category term="generic-base"/>
  37677.     <category term="numeric"/>
  37678.     <updated>2008-11-16T18:00:00+00:00</updated>
  37679.     <link href="http://www.ieee.org/portal/cms_docs_iportals/iportals/publications/authors/transjnl/stylemanual.pdf" rel="documentation"/>
  37680.   </info>
  37681.   <macro name="author">
  37682.     <names variable="author">
  37683.       <name initialize-with="." delimiter=", " and="text" name-as-sort-order="all"/>
  37684.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  37685.       <substitute>
  37686.     <names variable="editor"/>
  37687.     <names variable="translator"/>
  37688.       </substitute>
  37689.     </names>
  37690.   </macro>
  37691.   <macro name="editor">
  37692.     <names variable="editor">
  37693.       <name initialize-with="." delimiter=", " and="text" name-as-sort-order="all"/>
  37694.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  37695.     </names>
  37696.   </macro>
  37697.   <macro name="title">
  37698.     <choose>
  37699.       <if type="book">
  37700.     <text variable="title" font-style="italic"/>
  37701.       </if>
  37702.       <else>
  37703.     <text variable="title" quotes="true"/>
  37704.       </else>
  37705.     </choose>
  37706.   </macro>
  37707.   <macro name="publisher">
  37708.     <text variable="publisher-place" suffix=": " prefix=" "/>
  37709.     <text variable="publisher" suffix=", "/>
  37710.     <date variable="issued">
  37711.       <date-part name="year"/>
  37712.     </date>
  37713.   </macro>
  37714.   <macro name="access">
  37715.       <text variable="URL"/>
  37716.   </macro>
  37717.   <macro name="page">
  37718.     <group> 
  37719.       <label variable="page" form="short" suffix=". "/>
  37720.       <text variable="page" />
  37721.     </group>
  37722.   </macro>
  37723.   <citation>
  37724.     <option name="et-al-min" value="3"/>
  37725.     <option name="et-al-use-first" value="1"/>
  37726.     <option name="collapse" value="citation-number"/>
  37727.     <sort>
  37728.       <key variable="citation-number"/>
  37729.     </sort>
  37730.     <layout prefix="[" suffix="]" delimiter=",">
  37731.       <text variable="citation-number"/>
  37732.     </layout>
  37733.   </citation>
  37734.   <bibliography>
  37735.     <option name="entry-spacing" value="0"/>
  37736.     <option name="second-field-align" value="true"/>
  37737.     <layout suffix=".">
  37738.       <text variable="citation-number" prefix="[" suffix="]"/>
  37739.       <text macro="author" prefix=" " suffix=", "/>
  37740.       <choose>
  37741.     <if type="book">
  37742.       <group delimiter=", ">
  37743.         <text macro="title"/>
  37744.         <text macro="publisher"/>
  37745.       </group>
  37746.     </if>
  37747.     <else-if type="chapter">
  37748.       <group delimiter=", "> 
  37749.         <text macro="title"/>
  37750.         <text variable="container-title" font-style="italic"/>
  37751.         <text macro="editor"/>
  37752.         <text macro="publisher" />
  37753.         <text macro="page"/>
  37754.       </group>
  37755.     </else-if>
  37756.     <else-if type="patent">
  37757.       <text macro="title" suffix=", "/>
  37758.       <text variable="number" prefix="U.S. Patent "/>
  37759.       <date variable="issued" prefix=", ">
  37760.         <date-part name="month" suffix=" "/>
  37761.             <date-part name="day" suffix=", "/>
  37762.         <date-part name="year"/>
  37763.       </date>
  37764.     </else-if>
  37765.     <else-if type="thesis">
  37766.       <group delimiter=", ">
  37767.         <text macro="title"/>
  37768.         <text variable="genre"/>
  37769.         <text variable="publisher"/>
  37770.         <date variable="issued">
  37771.           <date-part name="year"/>
  37772.             </date>
  37773.       </group>   
  37774.     </else-if>
  37775.     <else>
  37776.       <group delimiter=", "> 
  37777.         <text macro="title"/>
  37778.         <text variable="container-title" font-style="italic"/>
  37779.         <text variable="volume" prefix=" vol. " />
  37780.         <date variable="issued" >
  37781.           <date-part name="month" form="short" suffix=". "/>
  37782.           <date-part name="year"/>
  37783.         </date>
  37784.         <text macro="page"/>
  37785.       </group>
  37786.     </else>
  37787.       </choose>
  37788.     </layout>
  37789.   </bibliography>
  37790. </style>
  37791. ');
  37792.  
  37793. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/harvard1', '2008-11-16 18:00:00', 'Harvard Reference format 1 (Author-Date)',
  37794. '<?xml version="1.0" encoding="UTF-8"?>
  37795. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  37796.   <info>
  37797.     <title>Harvard Reference format 1 (Author-Date)</title>
  37798.     <id>http://www.zotero.org/styles/harvard1</id>
  37799.     <link href="http://www.zotero.org/styles/harvard1"/>
  37800.     <author>
  37801.       <name>Julian Onions</name>
  37802.       <email>julian.onions@gmail.com</email>
  37803.     </author>
  37804.     <category term="author-date"/>
  37805.     <category term="generic-base"/>
  37806.     <updated>2008-11-16T18:00:00+00:00</updated>
  37807.     <summary>The Harvard author-date style</summary>
  37808.     <link href="http://libweb.anglia.ac.uk/referencing/harvard.htm" rel="documentation"/>
  37809.   </info>
  37810.   <macro name="editor">
  37811.     <names variable="editor" delimiter=", ">
  37812.       <name and="symbol" initialize-with=". " delimiter=", "/>
  37813.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  37814.     </names>
  37815.   </macro>
  37816.   <macro name="anon">
  37817.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  37818.   </macro>
  37819.   <macro name="author">
  37820.     <names variable="author">
  37821.       <name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with="."
  37822.         delimiter-precedes-last="never" delimiter=", "/>
  37823.       <label form="short" prefix=" " suffix="." text-case="lowercase"/>
  37824.       <substitute>
  37825.     <names variable="editor"/>
  37826.     <text macro="anon"/>
  37827.       </substitute>
  37828.     </names>
  37829.   </macro>
  37830.   <macro name="author-short">
  37831.     <names variable="author">
  37832.       <name form="short" and="symbol" delimiter=", " delimiter-precedes-last="never" initialize-with=". "/>
  37833.       <substitute>
  37834.     <names variable="editor"/>
  37835.     <names variable="translator"/>
  37836.     <text macro="anon"/>
  37837.       </substitute>
  37838.     </names>
  37839.   </macro>
  37840.   <macro name="access">
  37841.     <group>
  37842.       <text value="Available at:" suffix=" "/>
  37843.       <text variable="URL"/>
  37844.       <group prefix=" [" suffix="]">
  37845.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  37846.     <date variable="accessed">
  37847.       <date-part name="month" suffix=" "/>
  37848.       <date-part name="day" suffix=", "/>
  37849.       <date-part name="year"/>
  37850.     </date>
  37851.       </group>
  37852.     </group>
  37853.   </macro>
  37854.   <macro name="title">
  37855.     <choose>
  37856.       <if type="book thesis" match="any">
  37857.     <text variable="title" font-style="italic"/>
  37858.       </if>
  37859.       <else>
  37860.     <text variable="title"/>
  37861.       </else>
  37862.     </choose>
  37863.   </macro>
  37864.   <macro name="publisher">
  37865.     <group delimiter=": ">
  37866.       <text variable="publisher-place"/>
  37867.       <text variable="publisher"/>
  37868.     </group>
  37869.   </macro>
  37870.   <macro name="year-date">
  37871.     <choose>
  37872.       <if variable="issued">
  37873.     <date variable="issued">
  37874.       <date-part name="year"/>
  37875.     </date>
  37876.       </if>
  37877.       <else>
  37878.       <text term="no date"/>
  37879.       </else>
  37880.     </choose>
  37881.   </macro>
  37882.   <macro name="edition">
  37883.     <choose>
  37884.       <if is-numeric="edition">
  37885.     <group delimiter=" ">
  37886.       <number variable="edition" form="ordinal"/>
  37887.       <text term="edition" form="short" suffix="."/>
  37888.     </group>
  37889.       </if>
  37890.       <else>
  37891.       <text variable="edition" suffix="."/>
  37892.       </else>
  37893.     </choose>
  37894.   </macro>
  37895.   <macro name="pages">
  37896.     <group>
  37897.         <label variable="page" form="short" include-period="true" suffix=" "/>
  37898.       <text variable="page"/>
  37899.     </group>
  37900.   </macro>
  37901.   <citation>
  37902.     <option name="et-al-min" value="3"/>
  37903.     <option name="et-al-use-first" value="1"/>
  37904.     <option name="et-al-subsequent-min" value="3"/>
  37905.     <option name="et-al-subsequent-use-first" value="1"/>
  37906.     <option name="disambiguate-add-year-suffix" value="true"/>
  37907.     <option name="disambiguate-add-names" value="true"/>
  37908.     <option name="disambiguate-add-givenname" value="true"/>
  37909.     <layout prefix="(" suffix=")" delimiter="; ">
  37910.       <group delimiter=", ">
  37911.     <group delimiter=" ">
  37912.       <text macro="author-short"/>
  37913.       <text macro="year-date"/>
  37914.     </group>
  37915.     <group>
  37916.       <label variable="locator" suffix="." form="short"/>
  37917.       <text variable="locator"/>
  37918.     </group>
  37919.       </group>
  37920.     </layout>
  37921.   </citation>
  37922.   <bibliography>
  37923.     <option name="hanging-indent" value="true"/>
  37924.     <option name="et-al-min" value="4"/>
  37925.     <option name="et-al-use-first" value="1"/>
  37926.     <sort>
  37927.       <key macro="author"/>
  37928.       <key variable="title"/>
  37929.     </sort>
  37930.     <layout>
  37931.       <text macro="author" suffix=","/>
  37932.       <date variable="issued" prefix=" " suffix=".">
  37933.     <date-part name="year"/>
  37934.       </date>
  37935.       <choose>
  37936.     <if type="book">
  37937.       <group prefix=" " delimiter=" " suffix=",">
  37938.         <text macro="title" />
  37939.         <text macro="edition"/>
  37940.         <text macro="editor"/>
  37941.       </group>
  37942.       <text prefix=" " suffix="." macro="publisher"/>
  37943.     </if>
  37944.     <else-if type="chapter">
  37945.       <text macro="title" prefix=" " suffix="."/>
  37946.       <group class="container" prefix=" " delimiter=" ">
  37947.         <text term="in" text-case="capitalize-first"/>
  37948.         <text macro="editor"/>
  37949.         <text variable="container-title" font-style="italic" suffix="."/>
  37950.         <text variable="collection-title" suffix="."/>
  37951.         <group suffix="." delimiter=", ">
  37952.           <text macro="publisher" prefix=" "/>
  37953.           <text macro="pages" />
  37954.         </group>
  37955.       </group>
  37956.     </else-if>
  37957.     <else-if type="thesis">
  37958.       <group prefix=" " suffix="." delimiter=". ">
  37959.         <text macro="title"/>
  37960.         <text variable="genre"/>
  37961.         <text macro="publisher"/>
  37962.       </group>
  37963.     </else-if>
  37964.     <else>
  37965.       <group suffix=".">
  37966.         <text macro="title" prefix=" "/>
  37967.         <text macro="editor" prefix=" "/>
  37968.       </group>
  37969.       <group class="container" prefix=" " suffix=".">
  37970.         <text variable="container-title" font-style="italic"/>
  37971.         <group prefix=", ">
  37972.           <text variable="volume" />
  37973.           <text variable="issue" prefix="(" suffix=")"/>
  37974.         </group>
  37975.         <group prefix=", ">
  37976.           <label variable="locator" suffix="." form="short"/>
  37977.           <text variable="page"/>
  37978.         </group>
  37979.       </group>
  37980.     </else>
  37981.       </choose>
  37982.       <text prefix=" " macro="access" suffix="."/>
  37983.     </layout>
  37984.   </bibliography>
  37985. </style>
  37986. ');
  37987.  
  37988. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/mhra', '2008-02-02 00:00:00', 'Modern Humanities Research Association (Note with Bibliography)',
  37989. '<style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en"> 
  37990.   <info>
  37991.     <title>Modern Humanities Research Association (Note with Bibliography)</title>
  37992.     <id>http://www.zotero.org/styles/mhra</id>
  37993.     <link href="http://www.zotero.org/styles/mhra"/>
  37994.     <link href="http://www.mhra.org.uk/Publications/Books/StyleGuide/download.shtml" rel="documentation"/>
  37995.     <author>
  37996.       <name>Julian Onions</name>
  37997.       <email>julian.onions@gmail.com</email>
  37998.     </author>
  37999.     <category term="history"/>
  38000.     <category term="numeric"/>
  38001.     <category term="generic-base"/>
  38002.     <updated>2008-02-02T00:00:00+00:00</updated>
  38003.   </info>
  38004.   <macro name="editor-translator">
  38005.     <names variable="editor translator" prefix="" suffix="" delimiter=", ">
  38006.       <label form="verb-short" prefix=" " text-case="lowercase" suffix=" "/>
  38007.       <name and="text" delimiter=", "/>
  38008.     </names>
  38009.   </macro>
  38010.   <macro name="editor-translator-short">
  38011.     <names variable="editor translator" prefix="" suffix="" delimiter=", ">
  38012.       <label form="short" prefix=" " text-case="lowercase" suffix=". "/>
  38013.       <name and="text" delimiter=", "/>
  38014.     </names>
  38015.   </macro>
  38016.   <macro name="author">
  38017.     <names variable="author">
  38018.       <name name-as-sort-order="first" and="text" sort-separator=", "
  38019.         delimiter=", " delimiter-precedes-last="always"/>
  38020.       <label form="short" prefix=", " suffix="."/>
  38021.       <substitute>
  38022.     <names variable="editor"/>
  38023.     <names variable="translator"/>
  38024.     <text macro="title"/>
  38025.       </substitute>
  38026.     </names>
  38027.   </macro> 
  38028.   <macro name="author-full">
  38029.     <names variable="author">
  38030.       <name name-as-sort-order="all" and="text" sort-separator=", "
  38031.         delimiter=", " delimiter-precedes-last="always"/>
  38032.       <label form="short" prefix=", " suffix="."/>
  38033.       <substitute>
  38034.     <names variable="editor"/>
  38035.     <names variable="translator"/>
  38036.     <text macro="title"/>
  38037.       </substitute>
  38038.     </names>
  38039.   </macro>
  38040.   <macro name="author-short">
  38041.     <names variable="author">
  38042.       <name form="long" and="text" delimiter=", " />
  38043.       <label form="short" prefix=", " suffix="."/>
  38044.     </names>
  38045.   </macro>
  38046.   <macro name="access">
  38047.     <group>
  38048.       <text variable="URL"/>
  38049.       <group prefix=" (" suffix=")" delimiter=" ">
  38050.     <text term="accessed" text-case="lowercase" suffix=" "/>
  38051.     <date variable="accessed" suffix=", ">
  38052.       <date-part name="month" suffix=" "/>
  38053.       <date-part name="day" suffix=", "/>
  38054.       <date-part name="year"/>
  38055.     </date>
  38056.       </group>
  38057.     </group>
  38058.   </macro>
  38059.   <macro name="title">
  38060.     <choose>
  38061.       <if type="thesis">
  38062.     <text variable="title" form="long" quotes="true"/>
  38063.       </if>
  38064.       <else-if type="book">
  38065.     <text variable="title" form="long" font-style="italic"/>
  38066.       </else-if>
  38067.       <else>
  38068.     <text variable="title" form="long" quotes="true"/>
  38069.       </else>
  38070.     </choose>
  38071.   </macro>
  38072.   <macro name="publisher">
  38073.     <group delimiter=": ">
  38074.       <text variable="publisher-place"/>
  38075.       <text variable="publisher"/>
  38076.     </group>
  38077.   </macro>
  38078.   <macro name="pages">
  38079.     <choose>
  38080.       <if type="article-journal" match="none">
  38081.     <label variable="page" form="short" suffix=". "/>
  38082.       </if>
  38083.     </choose>
  38084.     <text variable="page"/>
  38085.   </macro>
  38086.   <macro name="locator">
  38087.     <label variable="locator" form="short" suffix=". "/>
  38088.     <text variable="locator"/>
  38089.   </macro>
  38090.   <macro name="vols">
  38091.     <choose>
  38092.       <if variable="number-of-volumes">
  38093.     <text variable="number-of-volumes"/>
  38094.     <text term="volume" prefix=" " form="short" plural="true"/>
  38095.       </if>
  38096.     </choose>
  38097.   </macro>
  38098.   <citation>
  38099.     <layout suffix="." delimiter="; ">
  38100.       <group suffix="">       
  38101.     <text macro="author-short" suffix=", "/>
  38102.     <text macro="title" prefix=""/>
  38103.     <choose>
  38104.       <if type="thesis">
  38105.         <group prefix=" (" delimiter=", " suffix=")">
  38106.           <text variable="genre"/>
  38107.           <text variable="publisher"/>
  38108.           <date variable="issued">
  38109.         <date-part name="year"/>
  38110.           </date>
  38111.         </group>
  38112.       </if>
  38113.       <else-if type="chapter">
  38114.         <group class="container" prefix=", ">
  38115.           <text term="in" text-case="lowercase"/>
  38116.           <text variable="container-title" font-style="italic" prefix=" " suffix=","/>
  38117.           <text variable="collection-title" prefix=" " suffix=","/>
  38118.           <text macro="editor-translator-short"/>
  38119.         </group>
  38120.         <group prefix=" (" suffix=")" delimiter=", ">
  38121.           <text macro="publisher" />
  38122.           <date variable="issued">
  38123.         <date-part name="year"/>
  38124.           </date>
  38125.         </group>
  38126.       </else-if>
  38127.       <else-if type="book">
  38128.         <group delimiter=", " prefix=" ">
  38129.           <text macro="editor-translator-short"/>
  38130.           <text variable="collection-title"/>
  38131.           <text variable="edition" suffix=" edn"/>
  38132.           <text macro="vols"/>
  38133.         </group>
  38134.         <group prefix=" (" suffix=")" delimiter=", ">
  38135.           <text macro="publisher"/>
  38136.           <date variable="issued" prefix=" " suffix="">
  38137.         <date-part name="year"/>
  38138.           </date>
  38139.         </group>
  38140.         <text variable="volume" prefix=", "/>
  38141.       </else-if>
  38142.       <else-if type="article-newspaper article-magazine" match="any">
  38143.         <group delimiter=", " prefix=", ">
  38144.           <text variable="container-title" font-style="italic"/>
  38145.           <text variable="issue"  suffix="."/>
  38146.           <date variable="issued">
  38147.         <date-part name="day" form="numeric" suffix=" "/>
  38148.         <date-part name="month" form="long" suffix=" "/>
  38149.         <date-part name="year"/>
  38150.           </date>          
  38151.         </group>
  38152.       </else-if>
  38153.       <else-if type="article-journal">
  38154.         <group class="container" prefix=", " delimiter=", ">
  38155.           <text variable="container-title" font-style="italic"/>
  38156.           <text macro="publisher"/>
  38157.           <text variable="volume"  prefix=" "/>
  38158.         </group>
  38159.         <date variable="issued" prefix=" (" suffix=")">
  38160.           <date-part name="year"/>
  38161.         </date>
  38162.       </else-if>
  38163.       <else>
  38164.         <group delimiter=", " prefix=". ">
  38165.           <text variable="container-title" font-style="italic"/>
  38166.           <text variable="issue"  prefix=", " suffix="."/>
  38167.           <date variable="issued">
  38168.         <date-part name="month" form="long"/>
  38169.         <date-part name="day" form="numeric" prefix=" " suffix=", "/>
  38170.         <date-part name="year"/>
  38171.           </date>          
  38172.         </group>
  38173.       </else>
  38174.     </choose>
  38175.     <group prefix=", " delimiter=" ">
  38176.       <text macro="pages"/>
  38177.       <text macro="locator" prefix="(" suffix=")"/>
  38178.     </group>
  38179.       </group> 
  38180.     </layout>
  38181.   </citation> 
  38182.   <bibliography>
  38183.     <option name="hanging-indent" value="true"/>
  38184.     <option name="et-al-min" value="6"/>
  38185.     <option name="et-al-use-first" value="6"/>
  38186.     <option name="subsequent-author-substitute" value="---"/>
  38187.     <sort>
  38188.       <key macro="author"/>
  38189.       <key variable="title"/>
  38190.     </sort>
  38191.     <layout suffix=".">
  38192.       <text macro="author" suffix=","/>
  38193.       <choose>
  38194.     <if type="thesis">
  38195.       <group suffix=".">
  38196.         <text macro="title" prefix=" "/>
  38197.       </group>
  38198.       <group delimiter=", " prefix=" ">
  38199.         <text variable="genre"/>
  38200.         <text variable="publisher"/>
  38201.         <date variable="issued">
  38202.           <date-part name="year"/>
  38203.         </date>
  38204.       </group>
  38205.     </if>
  38206.     <else-if type="chapter">
  38207.       <text macro="title" prefix=" "/>
  38208.       <group class="container" prefix=", ">
  38209.         <text term="in" text-case="lowercase"/>
  38210.         <text variable="container-title" font-style="italic" prefix=" " suffix=","/>
  38211.         <text variable="collection-title" prefix=" " suffix=","/>
  38212.         <text macro="editor-translator-short"/>
  38213.       </group>
  38214.       <group prefix=" (" suffix=")" delimiter=", ">
  38215.         <text macro="publisher" />
  38216.         <date variable="issued">
  38217.           <date-part name="year"/>
  38218.         </date>
  38219.       </group>
  38220.     </else-if>
  38221.     <else-if type="article-journal">
  38222.       <group suffix=".">
  38223.         <text macro="title" prefix=" "/>
  38224.         <text macro="editor-translator" prefix=" "/>
  38225.       </group>
  38226.       <group class="container" prefix=" " suffix="">
  38227.         <text variable="container-title" font-style="italic" prefix=" "/>
  38228.         <text variable="volume"  prefix=" "/>
  38229.         <text variable="issue" prefix=", no. "/>
  38230.         <date variable="issued" prefix=" (" suffix=")">
  38231.           <date-part name="month" suffix=" "/>
  38232.           <date-part name="day" suffix=", "/>
  38233.           <date-part name="year"/>
  38234.         </date>
  38235.         <text variable="page" prefix=": "/>
  38236.       </group>
  38237.     </else-if>
  38238.     <else-if type="article-newspaper article-magazine" match="any">
  38239.       <group suffix=".">
  38240.         <text macro="title" prefix=" "/>
  38241.         <text macro="editor-translator" prefix=" "/>
  38242.       </group>
  38243.       <group delimiter=", " prefix=" ">
  38244.         <text variable="container-title" font-style="italic"/>
  38245.         <text variable="issue"  suffix="."/>
  38246.         <date variable="issued">
  38247.           <date-part name="month" form="long"/>
  38248.           <date-part name="day" form="numeric" prefix=" " suffix=", "/>
  38249.           <date-part name="year"/>
  38250.         </date>          
  38251.       </group>
  38252.     </else-if>
  38253.     <else-if type="paper-conference">
  38254.       <group suffix=".">
  38255.         <text macro="title" prefix=" "/>
  38256.         <text macro="editor-translator" prefix=" "/>
  38257.       </group>
  38258.       <group suffix="">
  38259.         <text value="paper presented at" text-case="capitalize-first"/>
  38260.         <text variable="event" prefix=" "/>
  38261.         <text variable="event-place"  prefix=", "/>
  38262.         <date variable="event">
  38263.           <date-part name="month" form="long"/>
  38264.           <date-part name="day" form="numeric" prefix=" " suffix=", "/>
  38265.           <date-part name="year"/>
  38266.         </date>          
  38267.       </group>
  38268.     </else-if>
  38269.     <else-if type="book">
  38270.       <group suffix=".">
  38271.         <text macro="title" prefix=" " suffix="."/>
  38272.       </group>
  38273.       <group delimiter=", " prefix=" ">
  38274.         <text macro="editor-translator-short"/>
  38275.         <text variable="collection-title"/>
  38276.         <text variable="edition" suffix=" edn"/>
  38277.         <text macro="vols"/>
  38278.       </group>
  38279.       <group prefix=" (" suffix=")" delimiter=", ">
  38280.         <text macro="publisher"/>
  38281.         <date variable="issued" prefix=" " suffix="">
  38282.           <date-part name="year"/>
  38283.         </date>
  38284.       </group>
  38285.       <text variable="volume" prefix=", "/>
  38286.     </else-if>
  38287.     <else>
  38288.       <group suffix=".">
  38289.         <text macro="title" prefix=" "/>
  38290.         <text macro="editor-translator" prefix=" "/>
  38291.       </group>
  38292.       <group class="container" prefix=" " suffix="">
  38293.         <text variable="container-title" font-style="italic"/>
  38294.         <group prefix=", ">
  38295.           <text variable="volume" font-style="italic"/>
  38296.           <text variable="issue" prefix="(" suffix=")"/>
  38297.         </group>
  38298.         <text variable="page" prefix=", "/>
  38299.       </group>
  38300.     </else>
  38301.       </choose>
  38302.       <text prefix=" " macro="access"/>
  38303.     </layout>
  38304.   </bibliography>
  38305. </style>
  38306. ');
  38307.  
  38308. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/mhra_note_without_bibliography', '2008-11-16 18:00:00', 'Modern Humanities Research Association (Note without Bibliography)',
  38309. '<?xml version="1.0" encoding="UTF-8"?>
  38310. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  38311. <style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en">
  38312.   <info>
  38313.     <title>Modern Humanities Research Association (Note without Bibliography)</title>
  38314.     <id>http://www.zotero.org/styles/mhra_note_without_bibliography</id>
  38315.     <link href="http://www.zotero.org/styles/mhra_note_without_bibliography"/>
  38316.     <link href="http://www.mhra.org.uk/Publications/Books/StyleGuide/download.shtml" rel="documentation"/>
  38317.     <author>
  38318.       <name>Rintze Zelle</name>
  38319.       <uri>http://forums.zotero.org/account/831/</uri>
  38320.     </author>
  38321.     <summary>MHRA format with full notes and no bibliography</summary>
  38322.     <category term="generic-base"/>
  38323.     <category term="note"/>
  38324.     <updated>2008-11-16T18:00:00+00:00</updated>
  38325.   </info>
  38326.   <terms>
  38327.     <locale xml:lang="en">
  38328.       <term name="et-al">and others</term>
  38329.       <term name="editor" form="verb-short">ed. by</term>
  38330.       <term name="edition" form="short">edn</term>
  38331.       <term name="translator" form="verb-short">trans. by</term>
  38332.     </locale>
  38333.   </terms>
  38334.   <macro name="contributors-note">
  38335.     <names variable="author">
  38336.       <name and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="never"/>
  38337.     </names>
  38338.     <text macro="recipient-note"/>
  38339.   </macro>
  38340.   <macro name="title-note">
  38341.     <choose>
  38342.       <if type="book">
  38343.         <text variable="title" font-style="italic"/>
  38344.       </if>
  38345.       <else>
  38346.         <text variable="title" prefix="‘" suffix="’"/>
  38347.       </else>
  38348.     </choose>
  38349.   </macro>
  38350.   <macro name="editor-translator">
  38351.     <group delimiter=", ">
  38352.       <names variable="editor" delimiter=", ">
  38353.         <label form="verb-short" text-case="lowercase" suffix=" "/>
  38354.         <name and="text" delimiter=", " delimiter-precedes-last="never"/>
  38355.       </names>
  38356.       <choose>
  38357.         <if variable="author editor" match="any">
  38358.           <names variable="translator" delimiter=", ">
  38359.             <label form="verb-short" text-case="lowercase" suffix=" "/>
  38360.             <name and="text" delimiter=", " delimiter-precedes-last="never"/>
  38361.           </names>
  38362.         </if>
  38363.       </choose>
  38364.     </group>
  38365.   </macro>
  38366.   <macro name="collection-title">
  38367.     <text variable="collection-title"/>
  38368.     <text variable="collection-number" prefix=", "/>
  38369.   </macro>
  38370.   <macro name="locators-note">
  38371.     <choose>
  38372.       <if type="article-journal">
  38373.         <text variable="volume"/>
  38374.       </if>
  38375.       <else-if type="book chapter" match="any">
  38376.         <group delimiter=", ">
  38377.       <text macro="edition-note"/>
  38378.           <choose>
  38379.             <if variable="locator" match="none">
  38380.               <group>
  38381.                 <number variable="number-of-volumes" form="numeric"/>
  38382.                 <text term="volume" form="short" prefix=" " plural="true"/>
  38383.               </group>
  38384.             </if>
  38385.           </choose>
  38386.         </group>
  38387.       </else-if>
  38388.     </choose>
  38389.   </macro>
  38390.   <macro name="issue-note">
  38391.     <choose>
  38392.       <if type="article-journal">
  38393.         <choose>
  38394.           <if variable="volume">
  38395.             <text macro="issued" prefix=" (" suffix=")"/>
  38396.       </if>
  38397.       <else>
  38398.         <text macro="issued" prefix=", "/>
  38399.       </else>
  38400.     </choose>
  38401.       </if>
  38402.       <else-if variable="publisher-place publisher" match="any">
  38403.         <group prefix=" (" suffix=")" delimiter=", ">
  38404.           <group delimiter=" ">
  38405.             <choose>
  38406.               <if variable="title" match="none"> </if>
  38407.               <else-if type="thesis speech" match="any">
  38408.                 <text variable="genre" prefix="unpublished "/>
  38409.               </else-if>
  38410.             </choose>
  38411.             <text macro="event"/>
  38412.           </group>
  38413.           <text macro="publisher"/>
  38414.           <text macro="issued"/>
  38415.         </group>
  38416.       </else-if>
  38417.       <else>
  38418.         <text macro="issued" prefix=", "/>
  38419.       </else>
  38420.     </choose>
  38421.   </macro>
  38422.   <macro name="locators-specific-note">
  38423.     <choose>
  38424.       <if type="book chapter" match="any">
  38425.         <choose>
  38426.           <if is-numeric="volume">
  38427.             <number variable="volume" form="roman" font-variant="small-caps"/>
  38428.           </if>
  38429.         </choose>
  38430.       </if>
  38431.     </choose>
  38432.   </macro>
  38433.   <macro name="container-title-note">
  38434.     <choose>
  38435.       <if type="chapter">
  38436.     <text term="in" text-case="lowercase" suffix=" "/>
  38437.       </if>
  38438.     </choose>
  38439.     <text variable="container-title" font-style="italic"/>
  38440.   </macro>
  38441.   <macro name="edition-note">
  38442.     <choose>
  38443.       <if type="book chapter" match="any">
  38444.     <choose>
  38445.       <if is-numeric="edition">
  38446.         <group delimiter=" ">
  38447.           <number variable="edition" form="ordinal"/>
  38448.           <text term="edition" form="short"/>
  38449.         </group>
  38450.       </if>
  38451.       <else>
  38452.         <text variable="edition"/>
  38453.       </else>
  38454.     </choose>
  38455.       </if>
  38456.     </choose>
  38457.   </macro>
  38458.   <macro name="editor-note">
  38459.     <names variable="editor">
  38460.       <name and="text" sort-separator=", " delimiter=", "/>
  38461.       <label form="short" prefix=", " suffix="."/>
  38462.     </names>
  38463.   </macro>
  38464.   <macro name="translator-note">
  38465.     <names variable="translator">
  38466.       <name and="text" sort-separator=", " delimiter=", "/>
  38467.       <label form="verb-short" prefix=", " suffix="."/>
  38468.     </names>
  38469.   </macro>
  38470.   <macro name="recipient-note">
  38471.     <names variable="recipient" delimiter=", ">
  38472.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  38473.       <name and="text" delimiter=", "/>
  38474.     </names>
  38475.   </macro>
  38476.   <macro name="recipient-short">
  38477.     <names variable="recipient">
  38478.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  38479.       <name form="short" and="text" delimiter=", "/>
  38480.     </names>
  38481.   </macro>
  38482.   <macro name="contributors-short">
  38483.     <names variable="author">
  38484.       <name form="short" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="never"/>
  38485.       <substitute>
  38486.         <names variable="editor"/>
  38487.         <names variable="translator"/>
  38488.       </substitute>
  38489.     </names>
  38490.     <text macro="recipient-short"/>
  38491.   </macro>
  38492.   <macro name="interviewer-note">
  38493.     <names variable="interviewer" delimiter=", ">
  38494.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  38495.       <name and="text" delimiter=", "/>
  38496.     </names>
  38497.   </macro>
  38498.   <macro name="locators-newspaper">
  38499.     <choose>
  38500.       <if type="article-newspaper">
  38501.         <group delimiter=", ">
  38502.           <group>
  38503.         <text variable="edition" suffix=" "/>
  38504.         <text term="edition" prefix=" "/>
  38505.           </group>
  38506.           <group>
  38507.         <text term="section" suffix=" "/>
  38508.         <text variable="section"/>
  38509.           </group>
  38510.         </group>
  38511.       </if>
  38512.     </choose>
  38513.   </macro>
  38514.   <macro name="event">
  38515.     <group>
  38516.       <text term="presented at" suffix=" "/>
  38517.       <text variable="event"/>
  38518.     </group>
  38519.   </macro>
  38520.   <macro name="publisher">
  38521.     <group delimiter=": ">
  38522.       <text variable="publisher-place"/>
  38523.       <text variable="publisher"/>
  38524.     </group>
  38525.   </macro>
  38526.   <macro name="issued">
  38527.     <choose>
  38528.       <if type="graphic report article-newspaper" match="any">
  38529.         <date variable="issued">
  38530.           <date-part name="day" suffix=" "/>
  38531.           <date-part name="month" suffix=" "/>
  38532.           <date-part name="year"/>
  38533.         </date>
  38534.       </if>
  38535.       <else-if type="book chapter thesis" match="any">
  38536.         <date variable="issued">
  38537.           <date-part name="year"/>
  38538.         </date>
  38539.       </else-if>
  38540.       <else>
  38541.         <date variable="issued">
  38542.           <date-part name="year"/>
  38543.         </date>
  38544.       </else>
  38545.     </choose>
  38546.   </macro>
  38547.   <macro name="pages">
  38548.     <choose>
  38549.       <if type="article-journal">
  38550.         <text variable="page" prefix=", "/>
  38551.       </if>
  38552.       <else-if type="chapter book article-newspaper thesis" match="any">
  38553.         <label variable="page" form="short" include-period="true" prefix=", " suffix=" "/>
  38554.         <text variable="page"/>
  38555.       </else-if>
  38556.     </choose>
  38557.   </macro>
  38558.   <macro name="point-locators">
  38559.     <choose>
  38560.       <if variable="locator" match="none">
  38561.         <text macro="pages"/>
  38562.       </if>
  38563.       <else-if type="article-journal">
  38564.         <text variable="locator" prefix=": "/>
  38565.       </else-if>
  38566.       <else>
  38567.         <group prefix=", ">
  38568.           <choose>
  38569.         <if locator="page" match="none">
  38570.           <label variable="locator" form="short" include-period="true" suffix=" "/>
  38571.         </if>
  38572.       </choose>
  38573.           <text variable="locator"/>
  38574.         </group>
  38575.       </else>
  38576.     </choose>
  38577.   </macro>
  38578.   <macro name="archive-note">
  38579.     <group delimiter=", ">
  38580.       <text variable="archive_location"/>
  38581.       <text variable="archive"/>
  38582.       <text variable="archive-place"/>
  38583.     </group>
  38584.   </macro>
  38585.   <macro name="access-note">
  38586.     <group delimiter=", ">
  38587.       <choose>
  38588.         <if type="graphic report" match="any">
  38589.           <text macro="archive-note"  prefix=", "/>
  38590.     </if>
  38591.     <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  38592.           <text macro="archive-note"  prefix=", "/>
  38593.     </else-if>
  38594.       </choose>
  38595.     </group>
  38596.     <choose>
  38597.       <if variable="DOI">
  38598.         <text variable="DOI" prefix=" <doi:" suffix=">"/>
  38599.       </if>
  38600.       <else>
  38601.         <text variable="URL" prefix=" <" suffix=">"/>
  38602.         <group prefix=" [" suffix="]">
  38603.           <text term="accessed" text-case="lowercase"/>
  38604.           <date variable="accessed">
  38605.             <date-part name="day" prefix=" "/>
  38606.             <date-part name="month" prefix=" "/>
  38607.             <date-part name="year" prefix=" "/>
  38608.           </date>
  38609.         </group>
  38610.       </else>
  38611.     </choose>
  38612.   </macro>
  38613.   <citation>
  38614.     <option name="et-al-min" value="4"/>
  38615.     <option name="et-al-use-first" value="1"/>
  38616.     <option name="et-al-subsequent-min" value="4"/>
  38617.     <option name="et-al-subsequent-use-first" value="1"/>
  38618.     <option name="disambiguate-add-names" value="true"/>
  38619.     <option name="disambiguate-add-givenname" value="true"/>
  38620.     <layout prefix="" suffix="." delimiter="; ">
  38621.       <choose>
  38622.         <if position="subsequent">
  38623.           <text macro="contributors-short"/>
  38624.       <text macro="locators-specific-note" prefix=", "/>
  38625.           <text macro="point-locators"/>
  38626.         </if>
  38627.         <else>
  38628.           <group delimiter=", ">
  38629.             <text macro="contributors-note"/>
  38630.             <text macro="title-note"/>
  38631.         <text macro="container-title-note"/>
  38632.             <text macro="editor-translator"/>
  38633.         <text macro="collection-title"/>
  38634.         <text macro="locators-note"/>
  38635.           </group>
  38636.           <text macro="issue-note"/>
  38637.       <text macro="locators-specific-note" prefix=", "/>
  38638.           <text macro="locators-newspaper" prefix=", "/>
  38639.           <text macro="point-locators"/>
  38640.           <text macro="access-note"/>
  38641.         </else>
  38642.       </choose>
  38643.     </layout>
  38644.   </citation>
  38645. </style>');
  38646.  
  38647. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/mla', '2008-11-16 18:00:00', 'Modern Language Association',
  38648. '<?xml version="1.0" encoding="UTF-8"?>
  38649. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  38650.   <info>
  38651.     <title>Modern Language Association</title>
  38652.     <id>http://www.zotero.org/styles/mla</id>
  38653.     <link href="http://www.zotero.org/styles/mla"/>
  38654.     <author>
  38655.       <name>Simon Kornblith</name>
  38656.       <email>simon@simonster.com</email>
  38657.     </author>
  38658.     <contributor>
  38659.       <name> modified by Christian Werthschulte</name>
  38660.       <email>Christian.Werthschulte@rub.de</email>
  38661.     </contributor>
  38662.     <category term="generic-base"/>
  38663.     <category term="author-date"/>
  38664.     <updated>2008-11-16T18:00:00+00:00</updated>
  38665.   </info>
  38666.   <macro name="editor-translator">
  38667.     <names variable="editor translator" delimiter=". ">
  38668.       <label form="verb-short" text-case="capitalize-first" suffix=". "/>
  38669.       <name and="symbol" delimiter=", "/>
  38670.     </names>
  38671.   </macro>
  38672.   <macro name="author">
  38673.     <names variable="author">
  38674.       <name name-as-sort-order="first" and="text" sort-separator=", "
  38675.         delimiter=", " delimiter-precedes-last="always"/>
  38676.       <label form="short" prefix=", " suffix="."/>
  38677.       <substitute>
  38678.         <names variable="editor"/>
  38679.         <names variable="translator"/>
  38680.         <text macro="title"/>
  38681.       </substitute>
  38682.     </names>
  38683.   </macro>
  38684.   <macro name="author-short">
  38685.     <names variable="author">
  38686.       <name form="short" and="symbol" delimiter=", " initialize-with=". "/>
  38687.       <substitute>
  38688.         <names variable="editor"/>
  38689.         <names variable="translator"/>
  38690.         <text macro="title-short"/>
  38691.       </substitute>
  38692.     </names>
  38693.   </macro>
  38694.   <macro name="access">
  38695.     <group delimiter=" ">
  38696.       <date variable="accessed">
  38697.         <date-part name="day" suffix=" "/>
  38698.         <date-part name="month" form="short" include-period="true" suffix=" "/>
  38699.         <date-part name="year"/>
  38700.       </date>
  38701.       <text variable="URL" prefix="<" suffix=">"/>
  38702.     </group>
  38703.   </macro>
  38704.   <macro name="title">
  38705.     <choose>
  38706.       <if type="book">
  38707.         <text variable="title" font-style="italic"/>
  38708.       </if>
  38709.       <else>
  38710.         <text variable="title" quotes="true"/>
  38711.       </else>
  38712.     </choose>
  38713.   </macro>
  38714.   <macro name="title-short">
  38715.     <choose>
  38716.       <if type="book">
  38717.         <text variable="title" form="short" font-style="italic"/>
  38718.       </if>
  38719.       <else>
  38720.         <text variable="title" form="short" quotes="true"/>
  38721.       </else>
  38722.     </choose>
  38723.   </macro>
  38724.   <macro name="edition">
  38725.     <choose>
  38726.       <if is-numeric="edition">
  38727.         <group delimiter=" ">
  38728.           <number variable="edition" form="ordinal"/>
  38729.           <text term="edition" form="short" suffix="."/>
  38730.         </group>
  38731.       </if>
  38732.       <else>
  38733.         <text variable="edition"/>
  38734.       </else>
  38735.     </choose>
  38736.   </macro>
  38737.   <macro name="publisher-year">
  38738.     <group delimiter=", ">
  38739.       <group delimiter=": ">
  38740.         <text variable="publisher-place"/>
  38741.         <text variable="publisher"/>
  38742.       </group>
  38743.       <date variable="issued">
  38744.         <date-part name="year"/>
  38745.       </date>
  38746.     </group>
  38747.   </macro>
  38748.   <citation>
  38749.     <option name="et-al-min" value="4"/>
  38750.     <option name="et-al-use-first" value="1"/>
  38751.     <option name="disambiguate-add-names" value="true"/>
  38752.     <option name="disambiguate-add-givenname" value="true"/>
  38753.     <layout prefix="(" suffix=")" delimiter="; ">
  38754.       <group delimiter=" ">
  38755.         <choose>
  38756.           <if variable="author editor translator" match="any">
  38757.             <group delimiter=", ">
  38758.               <text macro="author-short"/>
  38759.               <choose>
  38760.                 <if disambiguate="true">
  38761.                   <text macro="title-short"/>
  38762.                 </if>
  38763.               </choose>
  38764.             </group>
  38765.           </if>
  38766.           <else>
  38767.             <text macro="title-short"/>
  38768.           </else>
  38769.         </choose>
  38770.         <text variable="locator"/>
  38771.       </group>
  38772.     </layout>
  38773.   </citation>
  38774.   <bibliography>
  38775.     <option name="hanging-indent" value="true"/>
  38776.     <option name="et-al-min" value="4"/>
  38777.     <option name="et-al-use-first" value="1"/>
  38778.     <option name="line-spacing" value="2"/>
  38779.     <option name="subsequent-author-substitute" value="---"/>
  38780.     <sort>
  38781.       <key macro="author"/>
  38782.       <key variable="title"/>
  38783.     </sort>
  38784.     <layout>
  38785.       <text macro="author" suffix="."/>
  38786.       <text macro="title" prefix=" " suffix="."/>
  38787.       <choose>
  38788.         <if type="book">
  38789.           <text macro="edition" prefix=" " suffix="."/>
  38790.           <text macro="editor-translator" prefix=" " suffix="."/>
  38791.           <text macro="publisher-year"  prefix=" " suffix="."/>
  38792.         </if>
  38793.         <else-if type="chapter">
  38794.           <group class="container">
  38795.             <text variable="container-title" font-style="italic" prefix=" " suffix="."/>
  38796.             <text macro="edition" prefix=" " suffix="."/>
  38797.             <text macro="editor-translator" prefix=" " suffix="."/>
  38798.             <text macro="publisher-year"  prefix=" " suffix="."/>
  38799.           </group>
  38800.           <text variable="page" prefix=" " suffix="."/>
  38801.         </else-if>
  38802.         <else>
  38803.           <group class="container" prefix=" " suffix="." delimiter=": ">
  38804.             <group delimiter=" ">
  38805.               <text macro="editor-translator" suffix="."/>
  38806.               <text variable="container-title" font-style="italic"/>
  38807.               <choose>
  38808.                 <if type="article-journal">
  38809.                   <group delimiter=" ">
  38810.                     <group delimiter=".">
  38811.                       <text variable="volume"/>
  38812.                       <text variable="issue"/>
  38813.                     </group>
  38814.                     <date variable="issued" prefix="(" suffix=")">
  38815.                       <date-part name="year"/>
  38816.                     </date>
  38817.                   </group>
  38818.                 </if>
  38819.                 <else>
  38820.                   <date variable="issued">
  38821.                     <date-part name="day" suffix=" "/>
  38822.                     <date-part name="month" form="short" include-period="true" suffix=" "/>
  38823.                     <date-part name="year"/>
  38824.                   </date>
  38825.                 </else>
  38826.               </choose>
  38827.             </group>
  38828.             <text variable="page"/>
  38829.           </group>
  38830.         </else>
  38831.       </choose>
  38832.       <text prefix=" " suffix="." macro="access"/>
  38833.     </layout>
  38834.   </bibliography>
  38835. </style>
  38836. ');
  38837.  
  38838. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/nature', '2008-05-08 19:00:00', 'Nature Journal',
  38839. '<?xml version="1.0" encoding="UTF-8"?>
  38840. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  38841. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  38842.     <info>
  38843.         <title>Nature Journal</title>
  38844.         <id>http://www.zotero.org/styles/nature</id>
  38845.         <link href="http://www.zotero.org/styles/nature"/>
  38846.         <author>
  38847.             <name>Michael Berkowitz</name>
  38848.             <email>mberkowi@gmu.edu</email>
  38849.         </author>
  38850.         <category term="biology"/>
  38851.         <category term="generic-base"/>
  38852.         <category term="numeric"/>
  38853.         <updated>2008-05-08T19:00:00+00:00</updated>
  38854.     </info>
  38855.     <macro name="title">
  38856.         <choose>
  38857.             <if type="book">
  38858.                 <text variable="title" font-style="italic"/>
  38859.             </if>
  38860.             <else>
  38861.                 <text variable="title"/>
  38862.             </else>
  38863.         </choose>
  38864.     </macro>
  38865.     <macro name="author">
  38866.         <names variable="author">
  38867.             <name sort-separator=", " delimiter=", " and="symbol" initialize-with="." delimiter-precedes-last="never" name-as-sort-order="all"/>
  38868.         </names>
  38869.     </macro>
  38870.     <macro name="access">
  38871.         <choose>
  38872.             <if variable="volume"/>
  38873.             <else-if variable="DOI">
  38874.                 <text variable="DOI" prefix="doi:"/>
  38875.             </else-if>
  38876.             <else-if variable="URL">
  38877.                 <text term="at"/>
  38878.                 <text variable="URL" prefix=" <" suffix=">"/>
  38879.             </else-if>
  38880.         </choose>
  38881.     </macro>
  38882.     <macro name="issuance">
  38883.         <choose>
  38884.             <if type="book">
  38885.                 <group prefix="(" suffix=").">
  38886.                     <text variable="publisher" suffix=": " />
  38887.                     <text variable="publisher-place" suffix=", " />
  38888.                     <date variable="issued">
  38889.                         <date-part name="year"/>
  38890.                     </date>
  38891.                 </group>
  38892.             </if>
  38893.             <else>
  38894.                 <date prefix="(" suffix=")." variable="issued">
  38895.                     <date-part name="year"/>
  38896.                 </date>
  38897.             </else>
  38898.         </choose>
  38899.     </macro>
  38900.     <citation>
  38901.         <option name="collapse" value="citation-number"/>
  38902.         <sort>
  38903.             <key variable="citation-number"/>
  38904.         </sort>
  38905.         <layout vertical-align="sup" delimiter=",">
  38906.             <text variable="citation-number"/>
  38907.         </layout>
  38908.     </citation>
  38909.     <bibliography>
  38910.         <option name="et-al-min" value="4"/>
  38911.         <option name="et-al-use-first" value="1"/>
  38912.         <option name="second-field-align" value="true"/>
  38913.         <option name="entry-spacing" value="0"/>
  38914.         <layout>
  38915.             <text variable="citation-number" suffix="."/>
  38916.             <text macro="author"/>
  38917.             <text macro="title" prefix=" " suffix=". "/>
  38918.             <text variable="container-title" font-style="italic" suffix=" " form="short"/>
  38919.             <text variable="volume" suffix=", " font-weight="bold"/>
  38920.             <text variable="page"/>
  38921.             <text macro="issuance" />
  38922.             <text macro="access" />
  38923.         </layout>
  38924.     </bibliography>
  38925. </style>
  38926. ');
  38927.  
  38928. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/nlm', '2008-11-16 18:00:00', 'National Library of Medicine',
  38929. '<?xml version="1.0" encoding="UTF-8"?>
  38930. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  38931. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  38932.   <info>
  38933.     <title>National Library of Medicine</title>
  38934.     <id>http://www.zotero.org/styles/nlm</id>
  38935.     <link href="http://www.zotero.org/styles/nlm"/>
  38936.     <author>
  38937.       <name>Michael Berkowitz</name>
  38938.       <email>mberkowi@gmu.edu</email>
  38939.     </author>
  38940.     <category term="generic-base"/>
  38941.     <category term="numeric"/>
  38942.     <updated>2008-11-16T18:00:00+00:00</updated>
  38943.   </info>
  38944.   <macro name="author">
  38945.     <names variable="author" suffix=". ">
  38946.       <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>
  38947.     </names>
  38948.   </macro>
  38949.   <macro name="editor">
  38950.     <names variable="editor" suffix=", editor(s). ">
  38951.       <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>
  38952.     </names>
  38953.   </macro>
  38954.   <macro name="publisher">
  38955.     <text variable="publisher-place" suffix=": "/>
  38956.     <text variable="publisher" suffix="; "/>
  38957.     <date variable="issued">
  38958.       <date-part name="year" suffix=". "/>
  38959.     </date>
  38960.   </macro>
  38961.   <macro name="access">
  38962.     <group delimiter=" ">
  38963.       <group prefix="[" suffix="]" delimiter=" ">
  38964.     <text term="cited" text-case="lowercase"/>
  38965.     <date variable="accessed" suffix=" ">
  38966.       <date-part name="year"/>
  38967.       <date-part name="month" prefix=" " form="short"/>
  38968.       <date-part name="day" prefix=" "/>
  38969.     </date>
  38970.       </group>
  38971.       <group>
  38972.     <text value="Available from: "/>
  38973.     <text variable="URL"/>
  38974.       </group>
  38975.     </group>
  38976.   </macro>
  38977.   <macro name="title">
  38978.     <group delimiter=" ">
  38979.       <text variable="title"/>
  38980.       <choose>
  38981.     <if variable="URL">
  38982.       <text term="internet" prefix="[" suffix="]" text-case="capitalize-first"/>
  38983.     </if>
  38984.       </choose>
  38985.     </group>
  38986.   </macro>
  38987.   <macro name="edition">
  38988.     <choose>
  38989.       <if is-numeric="edition">
  38990.     <group delimiter=" ">
  38991.       <number variable="edition" form="ordinal"/>
  38992.       <text term="edition" form="short" suffix="."/>
  38993.     </group>
  38994.       </if>
  38995.       <else>
  38996.       <text variable="edition" suffix="."/>
  38997.       </else>
  38998.     </choose>
  38999.   </macro>
  39000.   <citation>
  39001.     <option name="collapse" value="citation-number"/>
  39002.     <sort>
  39003.       <key variable="citation-number"/>
  39004.     </sort>
  39005.     <layout prefix="(" suffix=")" delimiter="; ">
  39006.       <text variable="citation-number"/>
  39007.     </layout>
  39008.   </citation>
  39009.   <bibliography>
  39010.     <option name="second-field-align" value="true"/>
  39011.     <layout>
  39012.       <text variable="citation-number" suffix=". "/>
  39013.       <text macro="author"/>
  39014.       <text macro="title" suffix=". "/>
  39015.       <choose>
  39016.     <if type="book">
  39017.       <text macro="edition" prefix=" " suffix=" "/>
  39018.       <text macro="publisher" prefix=" "/>
  39019.     </if>
  39020.     <else-if type="chapter">
  39021.       <group prefix=" " suffix=". ">
  39022.         <text term="in" suffix=": " text-case="capitalize-first"/>
  39023.         <text macro="editor"/>
  39024.         <text variable="container-title"/>
  39025.       </group>
  39026.       <text macro="publisher" prefix=" "/>
  39027.       <text variable="page" prefix=" p. " suffix="."/>
  39028.     </else-if>
  39029.     <else>
  39030.       <text variable="container-title" suffix=". " form="short"/>
  39031.       <date variable="issued" suffix=";">
  39032.         <date-part name="year" suffix=" "/>
  39033.         <date-part name="month" form="short" suffix=" "/>
  39034.         <date-part name="day"/>
  39035.       </date>
  39036.       <text variable="volume"/>
  39037.       <text variable="issue" prefix="(" suffix="):"/>
  39038.       <text variable="page" suffix="."/>
  39039.     </else>
  39040.       </choose>
  39041.       <text macro="access"/>
  39042.     </layout>
  39043.   </bibliography>
  39044. </style>
  39045. ');
  39046.